Python实践104-类的装饰器

类的装饰器

  • 貌似从Python3开始引入
  • 主要为了让某些构建更加容易表达,提供通用的功能
  • 用元类也能实现类装饰器的类似效果,但是元类的实现通常比较脆弱,并且元类会被继承,而类装饰器不会
  • 对于某些单个类特定的用法来说,使用元类并不合适,这个时候是类装饰器大施拳脚的好时机

类装饰器的语义

class A:
  pass
A = foo(bar(A))


@foo
@bar
class A:
  pass

类装饰器的例子

  • 类的装饰器是一个函数
  • 内部定义一个wrapper的类
  • 最后返回这个wrapper类
def decorator(cls):
    class Wrapper(object):
        def __init__(self, *args):
            self.wrapped = cls(*args)

        def __getattr__(self, name):
            print('Getting the {} of {}'.format(name, self.wrapped))
            return getattr(self.wrapped, name)

    return Wrapper

@decorator
class C(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


if __name__ == '__main__':
    x = C(1,2)
    print(x.x)
  • 运行结果如下
Getting the x of <__main__.C object at 0x106b91198>
1

代码地址

本系列文章和代码已经作为项目归档到github,仓库地址:jumper2014/PyCodeComplete。大家觉得有帮助就请在github上star一下,你的支持是我更新的动力。什么?你没有github账号?学习Python怎么可以没有github账号呢,快去注册一个啦!