Discuss / Python / 多重继承的时候如果两个父类的__slots__定义的不同会出错怎么办

多重继承的时候如果两个父类的__slots__定义的不同会出错怎么办

Topic source

如题,我发现当多重继承的时候,两个父类定义的slots不同会发生错误,但是如果一个父类没有定义slots则不会发生错误,而且在这种情况下似乎slots没有起到限定作用

class Person(object):
    __slots__ = ('__name','__sexy','__studentnum')
    def __init__(self,name,sexy):
        self.__name = name
        self.__sexy = sexy

    def getname(self):
        print("This person's name is:%s." % self.__name)

    def getsexy(self):
        print("This person is a %s." % self.__sexy)

    def setname(self,newname):
        self.__name = newname
        print("This person's new name is:%s." % self.__name)

class Student(object):
    __slots__ = ('__name','__studentnum','__sexy')
    def __init__(self,name,studentnum):
        self.__name = name
        self.__studentnum = studentnum

    def getname(self):
        print("This student's name is:%s." % self.__name)

    def getstudentnum(self):
        print("This student's number is:%s." % self.__studentnum)

class Person_Student(Person,Student):
    pass

当两个父类的slots完全相同的时候还是会出现冲突报错,这是为什么呢,求大神指点。在多重继承的时候不能再父类使用slots吗

廖雪峰

#3 Created at ... [Delete] [Delete and Lock User]

有了slots就别继承了,不要自己给自己找麻烦

Python对于这个有没有明确的定义呀?是不是只要定义了slots就会冲突?

不知道slots 的留言你有没有看 slots限制的是属性 通过方法调用来拥有属性,不在使用范围之内 所以对于方法是无法有限制的作用 但我突然想到@property ,我去尝试下看看

流泉滴沙

#6 Created at ... [Delete] [Delete and Lock User]

使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,如果子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots,如果子类中没有定义slots,父类的slots不会对子类造成影响,我测试了一下,没有错误

Abel_Leeeee

#7 Created at ... [Delete] [Delete and Lock User]

评论里学到了好多

BIN6167

#8 Created at ... [Delete] [Delete and Lock User]

评论里有个回复我觉得比较有价值,slots使用目的是为了减少内存使用而限制绑定属性,针对只需要几个绑定属性而又有大量实例的类。

另外, 思考,解决问题的时候,要走出来看看,这个问题真的值得花时间去探讨吗?

这也是初学者很容易走进的误区。


  • 1

Reply