分类目录:《系统学习Python》总目录


文章《系统学习Python——装饰器:类装饰器-[单例类:基础知识]》的单例示例阐明了如何使用类装饰器来管理一个类的所有实例。类装饰器的另一个常用场景是为每个生成的实例扩展接口。类装饰器基本上可以在实例上安装一个包装器或“代理"逻辑层,以某种方式管理对其接口的访问。

例如在第31章中,__getattr__运算符重载方法作为包装内嵌实例的完整对象接口的一种方式,以便实现委托编程模式。我们在之前的文章中介绍的管理的属性中看到过类似的例子。当获取未定义的属性名的时候,__getattr__会运行;我们可以使用这个钩子来拦截控制器类中的方法调用,并将它们传递给一个嵌人的对象。

为了便于参考,这里给出最初的非装饰器委托示例,它在两个内置类型对象上工作:

class Wrapper:
    def __init__(self, object):
        self.wrapped = object
        
    def __getattr__(self, attrname):
        print('Trace:', attrname)
        return getattr(self.wrapped, attrname)1234567

输入:

x = Wrapper([1,2,3])x.append(4)x.wrapped123

输出:

Trace: append[1, 2, 3, 4]12

在这段代码中,Wrapper类拦截了对任何被包装对象的命名属性的访问,打印出一条跟踪信息,并且使用内置数getattr来终止对包装对象的请求。准确地说,它跟踪在被包装对象的类之外发出的属性访问。在被包装对象的内部访问其方法不会被捕获,并且会按照设计正常运行。这种整体接口模型和函数装饰器的行为不同,装饰器只包装一个特定的方法。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.