我成功地創建裝飾任何類型的類一個裝飾,增加了標準的接口,所有這些,爲方便,集成等...裝飾一堂課 - 裝飾一次忘了吧?
我一直在使用元類的抵制,因爲文學在這一點上說,這是一個矯枉過正的問題,大多數時候都可以被類裝飾器所替代。我遇到的困難是:
def Decorator(somearg):
def wrapper(cls):
clsinit = cls.__init__
cls.members = []
def __init__(self, *args, **kwargs):
#do something with somearg...
self.__class__.members.append(self)
clsinit(self,*args,**kwargs)
cls.__init__ = clsinit
return cls
return wrapper
@Decorator('thearg')
class A(object):
pass
a = A()
b = A()
使用python調試器,在導入時,類A立即用參數'thearg'裝飾。但是每次我實例化A()時,實例都直接調用裝飾器中定義的init,而不通過先前的層。這很好,因爲我希望我的課程記錄每個成員,並且不會在每次新實例實例化時都重置。但我不確定我明白爲什麼。
有人可以解釋在這種特定情況下的python解釋器的物理?
您發佈的代碼有問題。它有一個SyntaxError,可能會觸發'somearg'和'cls'的角色。它是你的真實代碼的簡化版本嗎?請測試並修復。 – unutbu 2013-02-09 03:46:12
我修復了代碼 – 2013-02-09 09:25:08
這實際上就是應該使用元類的東西。沒有明確裝飾每個子類,修飾器就無法處理它。 – 2013-02-09 19:17:46