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

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

如何在運行時動態(tài)更改實例的基類?

如何在運行時動態(tài)更改實例的基類?

慕斯王 2019-10-11 10:42:17
本文的摘要顯示了__bases__通過將類添加到繼承它的現(xiàn)有類的類集合中來動態(tài)更改某些Python代碼的繼承層次結(jié)構(gòu)的用法。好的,這很難看懂,代碼可能更清晰:class Friendly:    def hello(self):        print 'Hello'class Person: passp = Person()Person.__bases__ = (Friendly,)p.hello()  # prints "Hello"也就是說,Person它不是從Friendly源級別繼承的,而是通過修改__bases__Person類的屬性在運行時動態(tài)添加此繼承關(guān)系。但是,如果更改Friendly并Person成為新的樣式類(通過從object繼承),則會出現(xiàn)以下錯誤:TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'對此進(jìn)行一些谷歌搜索似乎表明新樣式類和舊樣式類在運行時更改繼承層次結(jié)構(gòu)方面存在一些不兼容性。具體來說:“新型類對象不支持對其bases屬性的分配”。我的問題是,是否可以使用Python 2.7+中的新型類,使上面的Friendly / Person示例工作,可能是通過使用__mro__屬性?免責(zé)聲明:我完全意識到這是晦澀的代碼。我完全意識到,在實際的生產(chǎn)代碼中,這樣的技巧往往難以理解,這純粹是一個思想實驗,并且讓人們從中學(xué)習(xí)有關(guān)Python如何處理與多重繼承相關(guān)的問題的知識。
查看完整描述

3 回答

?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗 獲得超10個贊

好的,再次,這不是您通常應(yīng)該執(zhí)行的操作,僅用于提供信息。


其中的Python查找一個實例對象的方法是由確定__mro__它定義了對象(該類的屬性中號 ethod ? esolution ?刻申屬性)。因此,如果我們能夠改變__mro__的Person,我們會得到期望的行為。就像是:


setattr(Person, '__mro__', (Person, Friendly, object))

問題是這__mro__是一個只讀屬性,因此setattr將不起作用。也許如果您是Python專家,那么可以采取一些措施,但顯然我沒有達(dá)到專家地位,因為我想不到。


一個可能的解決方法是簡單地重新定義該類:


def modify_Person_to_be_friendly():

    # so that we're modifying the global identifier 'Person'

    global Person


    # now just redefine the class using type(), specifying that the new

    # class should inherit from Friendly and have all attributes from

    # our old Person class

    Person = type('Person', (Friendly,), dict(Person.__dict__)) 


def main():

    modify_Person_to_be_friendly()

    p = Person()

    p.hello()  # works!

這不做的是修改任何先前創(chuàng)建的Person實例以使用該hello()方法。例如(僅修改main()):


def main():

    oldperson = Person()

    ModifyPersonToBeFriendly()

    p = Person()

    p.hello()  

    # works!  But:

    oldperson.hello()

    # does not

如果type調(diào)用的細(xì)節(jié)不清楚,請閱讀e-satis關(guān)于“ Python中的元類是什么?”的出色答案。。


查看完整回答
反對 回復(fù) 2019-10-11
?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗 獲得超4個贊

我不能保證后果,但是這段代碼可以滿足您在py2.7.2上的要求。


class Friendly(object):

    def hello(self):

        print 'Hello'


class Person(object): pass


# we can't change the original classes, so we replace them

class newFriendly: pass

newFriendly.__dict__ = dict(Friendly.__dict__)

Friendly = newFriendly

class newPerson: pass

newPerson.__dict__ = dict(Person.__dict__)

Person = newPerson


p = Person()

Person.__bases__ = (Friendly,)

p.hello()  # prints "Hello"

我們知道這是可能的。涼。但是我們永遠(yuǎn)不會使用它!


查看完整回答
反對 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 580 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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