当具有__slots__的类的多继承时,Python 3.6.5"多个库有实例布局冲突"

xsu*_*ira 7 python multiple-inheritance slots

如果我运行此代码,我得到主题错误消息.但为什么?如何避免它让C班级有父母的位置?

class A():
        __slots__ = ['slot1']

class B():
        __slots__ = ['slot2']

class C(A, B):
        __slots__ = []
Run Code Online (Sandbox Code Playgroud)

MT-*_*ong 5

简单地说,你就是做不到。

正如文档中所述

可以使用具有多个槽父类的多重继承,但只允许一个父类具有由槽创建的属性(其他基类必须具有空槽布局) - 违规会引发 TypeError。

背后的想法__slots__是为实例的内存布局中的每个属性保留特定的插槽A并且B试图为slot1slot2属性保留相同的内存布局部分,并且C不能为两个属性保留相同的内存。它只是不兼容。


感谢评论中提到的 JCode,修改以下方法为正确。

但是总有办法,我个人更喜欢__slots__在有多个继承类时使用包含所有必需插槽的公共基类。

import pympler.asizeof
class base():
    __slots__ = ['a','b']

class A(base):
    __slots__ = []

class B(base):
    __slots__ = []

class C(A,B):
    __slots__ = []

class D():
    pass

#Update
bb = base()
bb.a = 100
bb.b = 100
print(pympler.asizeof.asizeof(bb))
a = A()
a.a = 100
a.b = 100
print(pympler.asizeof.asizeof(a))
c = C()
c.a = 100
c.b = 100
print(pympler.asizeof.asizeof(c))
d = D()
d.a = 100
d.b = 100
print(pympler.asizeof.asizeof(d))
Run Code Online (Sandbox Code Playgroud)

更新 4 个值将是 88、88、88、312。虽然__slots__保留。