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

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

如何從 python 中傳遞給超類(lèi)的字符串創(chuàng)建子類(lèi)?

如何從 python 中傳遞給超類(lèi)的字符串創(chuàng)建子類(lèi)?

小唯快跑啊 2022-10-18 17:03:33
給定一個(gè)具有兩個(gè)(或許多)子類(lèi)的超類(lèi),為簡(jiǎn)單起見(jiàn),我們分別稱(chēng)它們?yōu)?Super、Sub1 和 Sub2。我想實(shí)例化 Sub1 和 Sub2 如下:s1 = Super('Sub1') s2 = Super('Sub2')即,將子類(lèi)的名稱(chēng)作為字符串傳遞給超類(lèi)的構(gòu)造函數(shù)。想到的事情是在 Super 中使用子類(lèi)的名稱(chēng)定義一個(gè)類(lèi)變量,并在 Super 類(lèi)的構(gòu)造函數(shù)中使用幾個(gè) if 語(yǔ)句,可以調(diào)用相應(yīng)的子類(lèi)構(gòu)造函數(shù)。我不完全確定這是否可行,但對(duì)我來(lái)說(shuō)似乎很亂。歡迎任何關(guān)于如何用干凈和 Pythonic 的方法解決這個(gè)問(wèn)題的建議。
查看完整描述

2 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

這需要重寫(xiě)Super.__new__以使其成為工廠(chǎng)函數(shù)。


class Super:

    def __new__(cls, subclass_name, *args, **kwargs):

        for sc in cls.__subclasses__():

            if sc.__name__ == subclass_name:

                return super().__new__(sc, *args, **kwargs)

        raise ValueError("No such subclass")    



class Sub1(Super):

    pass



class Sub2(Super):

    pass



assert type(Super('Sub1')) is Sub1

這需要更多的工作來(lái)允許您直接定義一個(gè)子類(lèi)(就像Sub1()調(diào)用一樣Super.__new__,因?yàn)镾ub1.__new__沒(méi)有定義)。


因此,我更喜歡采用類(lèi)名的專(zhuān)用類(lèi)方法,而不是覆蓋__new__.


class Super:

    @classmethod

    def subclass_by_name(cls, name, *args, **kwargs):

        for sc in cls.__subclasses__():

            if sc.__name__ == name:

                return sc(*args, **kwargs)

        raise ValueError("No such subclass")



assert type(Super.subclass_by_name('Sub1')) is Sub1


查看完整回答
反對(duì) 回復(fù) 2022-10-18
?
蠱毒傳說(shuō)

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

我真的不認(rèn)為這是一個(gè)好主意。超類(lèi)并不意味著作為可能子類(lèi)的有限列表的容器,這幾乎完全違背了繼承的觀(guān)點(diǎn)。如果我是你,我會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的工廠(chǎng),從中可以構(gòu)造我想要的對(duì)象,例如:


class Fruit():

  ...


class Apple(Fruit):

  ...


class Pear(Fruit):

  ...



fruits = {

   "apple": Apple,

   "pear": Pear       

}


def make_fruit(name, **kwargs):

    return fruits[name](**kwargs)


apple = make_fruit("apple", colour="red")

pear = make_fruit("pear", size="small)


查看完整回答
反對(duì) 回復(fù) 2022-10-18
  • 2 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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