您可以通过使用metaclass上的
__getattr__钩子来实现。
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调用结果直接设置到该类上,有效地将其缓存以供将来查找。
如果您需要在每次调用时重新生成类方法,请使用相同的方法将函数绑定到实例,但是将类和元类绑定到实例(
cls.__metaclass__与元类子类保持一致):
from types import MethodTypeclass DefaultClassMethods(type): def __getattr__(cls, attr): def _defaultClassMethod(cls): print 'Hi, I am the default class method!' return _defaultClassMethod.__get__(cls, cls.__metaclass__)
对于静态方法,只需在所有情况下直接返回该函数,而无需使用
staticmethod装饰器或描述符协议。



