5
我想在創建類時自動運行一些可以調用其他類方法的代碼。我從類聲明本身沒有找到這樣做的方法,最終創建一個名爲__clsinit__
的@classmethod
,並在類聲明後立即從定義範圍中調用它。有沒有我可以定義的方法,以便在類對象創建後自動調用它?創建Python類時調用類方法
我想在創建類時自動運行一些可以調用其他類方法的代碼。我從類聲明本身沒有找到這樣做的方法,最終創建一個名爲__clsinit__
的@classmethod
,並在類聲明後立即從定義範圍中調用它。有沒有我可以定義的方法,以便在類對象創建後自動調用它?創建Python類時調用類方法
你可以用metaclass或class decorator來做到這一點。
類裝飾(自2.6)可能更容易理解:
def call_clsinit(cls):
cls._clsinit()
return cls
@call_clsinit
class MyClass:
@classmethod
def _clsinit(cls):
print "MyClass._clsinit()"
元類是功能更強大;他們可以調用代碼並在創建之前修改類的成分以及之後(也可以繼承它們):
def call_clsinit(*args, **kwargs):
cls = type(*args, **kwargs)
cls._clsinit()
return cls;
class MyClass(object):
__metaclass__ = call_clsinit
@classmethod
def _clsinit(cls):
print "MyClass._clsinit()"
我至少從問題的文本中補充說,很難說爲什麼'__new__'或'__init__'不能做到這一點。 –
創建類或創建實例嗎?因爲兩者都可以完成,但答案不同。 –
你可以爲此使用元類。看看例子[這個問題](http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)。 – BrenBarn
另外:請不要編制'__special_methods__'。這是爲Python語言保留的。如果您希望它是私人的,請使用'_single_underscore_prefix'。 – delnan