您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python动态类方法

Python动态类方法

您可以通过使用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 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__)

对于静态方法,只需在所有情况下直接返回该函数,而无需使用staticmethod装饰器或描述符协议。

python 2022/1/1 18:50:10 有364人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶