亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當具有 __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 關注
  • 382 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號