3 回答

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

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
所以,你可以有你的蛋糕和吃它-繼承和裝飾!
添加回答
舉報