为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2021-07-26 17:53:54
如果我运行此代码,则会收到主题错误消息。但为什么?以及如何避免它让C班级拥有其父级插槽?class A():        __slots__ = ['slot1']class B():        __slots__ = ['slot2']class C(A, B):        __slots__ = []
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

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


正如文档中所述,


可以使用具有多个槽父类的多重继承,但只允许一个父类具有由槽创建的属性(其他基类必须具有空槽布局) - 违规会引发 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__保留。


查看完整回答
反对 回复 2021-08-03
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

对于带槽的类使用多重继承,一种实用的选择是只有一个父类具有非空槽。其余的类然后用作具有定义(但为空)插槽的“混合”。然后,在子类中,根据需要简单地定义最终插槽。


如前所述,当所有父项都定义非空槽时,多重继承是有问题的。


>>> class B: __slots__ = ('a', 'b')

... 

>>> class C: __slots__ = ('a', 'b')

... 

>>> class D(C, B): __slots__ = ('a', 'b')

... 

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: multiple bases have instance lay-out conflict


>>> class D(C, B): __slots__ = ('a', 'b', 'c')

... 

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: multiple bases have instance lay-out conflict

这里建议的方法构成C一个定义空槽的“mixin”类。然后子类使用多重继承,可以简单地将插槽定义为所需的任何内容。


>>> class B: __slots__ = ('a', 'b')

... 

>>> class C: __slots__ = ()

... 

>>> class D(C, B): __slots__ = ('a', 'b')

... 

>>> class D(C, B): __slots__ = ('a', 'b', 'c')

... 


查看完整回答
反对 回复 2021-08-03
  • 3 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号