第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

當(dāng)具有 __slots__ 的類的多重繼承時(shí),Python 3.6.5“多個(gè)基有實(shí)例布局沖突”

當(dāng)具有 __slots__ 的類的多重繼承時(shí),Python 3.6.5“多個(gè)基有實(shí)例布局沖突”

九州編程 2021-07-26 17:53:54
如果我運(yùn)行此代碼,則會(huì)收到主題錯(cuò)誤消息。但為什么?以及如何避免它讓C班級(jí)擁有其父級(jí)插槽?class A():        __slots__ = ['slot1']class B():        __slots__ = ['slot2']class C(A, B):        __slots__ = []
查看完整描述

3 回答

?
www說(shuō)

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


查看完整回答
反對(duì) 回復(fù) 2021-08-03
?
慕運(yùn)維8079593

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')

... 


查看完整回答
反對(duì) 回復(fù) 2021-08-03
  • 3 回答
  • 0 關(guān)注
  • 388 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)