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

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

如何裝飾一堂課?

如何裝飾一堂課?

慕慕森 2019-11-23 13:03:26
在Python 2.5中,有沒有辦法創(chuàng)建裝飾類的裝飾器?具體來說,我想使用裝飾器將成員添加到類中,并更改構(gòu)造函數(shù)以獲取該成員的值。尋找類似以下的內(nèi)容(在“ Foo類:”上存在語法錯誤:def getId(self): return self.__idclass addID(original_class):    def __init__(self, id, *args, **kws):        self.__id = id        self.getId = getId        original_class.__init__(self, *args, **kws)@addIDclass Foo:    def __init__(self, value1):        self.value1 = value1if __name__ == '__main__':    foo1 = Foo(5,1)    print foo1.value1, foo1.getId()    foo2 = Foo(15,2)    print foo2.value1, foo2.getId()我想我真正想要的是在Python中執(zhí)行類似C#接口的方法。我想我應(yīng)該改變我的范式。
查看完整描述

3 回答

?
慕桂英4014372

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

除了類裝飾器是否是您的問題的正確解決方案的問題之外:


在Python 2.6和更高版本中,有帶有@語法的類裝飾器,因此您可以編寫:


@addID

class Foo:

    pass

在舊版本中,您可以使用另一種方法:


class Foo:

    pass


Foo = addID(Foo)

但是請注意,這與函數(shù)裝飾器的工作原理相同,并且裝飾器應(yīng)返回新(或修改后的原始)類,這不是您在示例中所做的。addID裝飾器如下所示:


def addID(original_class):

    orig_init = original_class.__init__

    # Make copy of original __init__, so we can call it without recursion


    def __init__(self, id, *args, **kws):

        self.__id = id

        self.getId = getId

        orig_init(self, *args, **kws) # Call the original __init__


    original_class.__init__ = __init__ # Set the class' __init__ to the new one

    return original_class

然后,您可以按照上述方式為Python版本使用適當(dāng)?shù)恼Z法。


但是我同意其他人的觀點(diǎn),如果你想重寫繼承,繼承更適合__init__。


查看完整回答
反對 回復(fù) 2019-11-23
?
藍(lán)山帝景

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

沒有人解釋過您可以動態(tài)定義類。因此,您可以有一個裝飾器來定義(并返回)一個子類:


def addId(cls):


    class AddId(cls):


        def __init__(self, id, *args, **kargs):

            super(AddId, self).__init__(*args, **kargs)

            self.__id = id


        def getId(self):

            return self.__id


    return AddId

可以在Python 2中使用它(來自Blckknght的評論,它解釋了為什么您應(yīng)該在2.6+中繼續(xù)這樣做):


class Foo:

    pass


FooId = addId(Foo)

并且在Python 3中是這樣的(但要小心super()在類中使用):


@addId

class Foo:

    pass

所以,你可以有你的蛋糕和吃它-繼承和裝飾!


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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