您可以通過在metaclass使用__getattr__
hook實現這一目標。
class DefaultClassMethods(type):
def __getattr__(cls, attr):
def _defaultClassMethod(cls):
print 'Hi, I am the default class method!'
setattr(cls, attr, classmethod(_defaultClassMethod))
return getattr(cls, attr)
演示:
>>> class DefaultClassMethods(type):
... def __getattr__(cls, attr):
... def _defaultClassMethod(cls):
... print 'Hi, I am the default class method!'
... setattr(cls, attr, classmethod(_defaultClassMethod))
... return getattr(cls, attr)
...
>>> class A(object):
... __metaclass__ = DefaultClassMethods
...
>>> A.spam
<bound method DefaultClassMethods._defaultClassMethod of <class '__main__.A'>>
>>> A.spam()
Hi, I am the default class method!
請注意,我們的classmethod
調用的結果集直接到類,有效地緩存,以備日後查詢。
如果您需要重新在每次調用類的方法來代替,使用相同的method to bind a function to an instance但與類和元類,而不是(使用cls.__metaclass__
要與元類的子類一致):
from types import MethodType
class DefaultClassMethods(type):
def __getattr__(cls, attr):
def _defaultClassMethod(cls):
print 'Hi, I am the default class method!'
return _defaultClassMethod.__get__(cls, cls.__metaclass__)
對於靜態方法只是在所有情況下直接返回函數,不需要使用裝飾器或描述符協議。
A.asd() - AttributeError的:「對象類型 'A' 具有沒有屬性'asd'「 –
@EcirHana:啊,你的意思是一個默認的類方法,將會更新。 –
我希望垃圾郵件是類方法,而不是實例方法。 –