当前位置 : 主页 > 手机开发 > 其它 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-19
如果我运行此代码,我得到主题错误消息.但为什么?如何避免让C类拥有其父级插槽? class A(): __slots__ = ['slot1']class B(): __slots__ = ['slot2']class C(A, B): __slots__ = [] 简单地说,你就是做不到. 如
如果我运行此代码,我得到主题错误消息.但为什么?如何避免让C类拥有其父级插槽?

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

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

class C(A, B):
        __slots__ = []
简单地说,你就是做不到.

如Documentation所述,

Multiple inheritance with multiple slotted parent classes can be used, but only one parent is allowed to have attributes created by slots (the other bases must have empty slot layouts) – violations raise TypeError.

__slots__背后的想法是为实例的内存布局中的每个属性保留特定的插槽. A和B正在尝试为slot1和slot2属性保留其内存布局的相同部分,并且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))

更新4个值将是88,88,88,312.虽然__slots__保留.

网友评论