gpt4 book ai didi

Python 3.6.5 "Multiple bases have instance lay-out conflict"具有 __slots__ 的类的多重继承

转载 作者:太空狗 更新时间:2023-10-29 21:51:43 28 4
gpt4 key购买 nike

如果我运行这段代码,我会收到主题错误消息。但为什么?以及如何避免它让 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__ 背后的想法是为实例的内存布局中的每个属性保留特定的插槽AB 试图为 slot1slot2 属性保留内存布局的相同部分,并且C 不能为两个属性保留相同的内存。只是不兼容。


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

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

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__ 已保留。

关于Python 3.6.5 "Multiple bases have instance lay-out conflict"具有 __slots__ 的类的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53060607/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com