您可以通过在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:啊,你的意思是一个默认的类方法,将会更新。 –
我希望垃圾邮件是类方法,而不是实例方法。 –