3 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
簡(jiǎn)單地說(shuō),你就是做不到。
正如文檔中所述,
可以使用具有多個(gè)槽父類的多重繼承,但只允許一個(gè)父類具有由槽創(chuàng)建的屬性(其他基類必須具有空槽布局) - 違規(guī)會(huì)引發(fā) TypeError。
背后的想法__slots__是為實(shí)例的內(nèi)存布局中的每個(gè)屬性保留特定的插槽。A并且B試圖為slot1和slot2屬性保留相同的內(nèi)存布局部分,并且C不能為兩個(gè)屬性保留相同的內(nèi)存。它只是不兼容。
感謝評(píng)論中提到的 JCode,修改以下方法為正確。
但是總有辦法,我個(gè)人更喜歡__slots__在有多個(gè)繼承類時(shí)使用包含所有必需插槽的公共基類。
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 個(gè)值將是 88、88、88、312。雖然__slots__保留。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
對(duì)于帶槽的類使用多重繼承,一種實(shí)用的選擇是只有一個(gè)父類具有非空槽。其余的類然后用作具有定義(但為空)插槽的“混合”。然后,在子類中,根據(jù)需要簡(jiǎn)單地定義最終插槽。
如前所述,當(dāng)所有父項(xiàng)都定義非空槽時(shí),多重繼承是有問(wèn)題的。
>>> 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
這里建議的方法構(gòu)成C一個(gè)定義空槽的“mixin”類。然后子類使用多重繼承,可以簡(jiǎn)單地將插槽定義為所需的任何內(nèi)容。
>>> class B: __slots__ = ('a', 'b')
...
>>> class C: __slots__ = ()
...
>>> class D(C, B): __slots__ = ('a', 'b')
...
>>> class D(C, B): __slots__ = ('a', 'b', 'c')
...
添加回答
舉報(bào)