2012-08-24 89 views
5

我想在創建類時自動運行一些可以調用其他類方法的代碼。我從類聲明本身沒有找到這樣做的方法,最終創建一個名爲__clsinit__@classmethod,並在類聲明後立即從定義範圍中調用它。有沒有我可以定義的方法,以便在類對象創建後自動調用它?創建Python類時調用類方法

+2

創建類或創建實例嗎?因爲兩者都可以完成,但答案不同。 –

+1

你可以爲此使用元類。看看例子[這個問題](http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)。 – BrenBarn

+6

另外:請不要編制'__special_methods__'。這是爲Python語言保留的。如果您希望它是私人的,請使用'_single_underscore_prefix'。 – delnan

回答

10

你可以用metaclassclass 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()" 
+2

我至少從問題的文本中補充說,很難說爲什麼'__new__'或'__init__'不能做到這一點。 –