3 回答

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

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')
...
添加回答
舉報