包装是一个通用的名字,意思是对一个已存在的对象进行包装,不管它是数据类型还是一段代码,可以
是对一个已存在的对象增加新的、删除不要的或修改其他已存在的功能
你可以包装任何类型作为一个类的核心成员,以使新对象的行为模仿你想要的数据类型中已存在的行为
并且去掉你不希望存在的行为,可能会要做一些额外的事情。这就是“包装类型”
包装包括定义一个类,它的实例拥有标准类型的核心行为。
授权是包装的一个特性,可用于简化处理相关命令性功能,采用已存在的功能以达到最大限度的代码重用。
包装一个类型通常是对已存在的类型的一些定制。这种做法可以新建、修改或删除原有产品功能。其他的
则保持原样,或者保留已存功能和行为。授权的过程。即是所有更新的功能都是由心累的某部分来处理,
单已存在的功能就授权给对象的默认属性。
实现授权的关键点就是覆盖__getattr__()方法,在代码中包含一个对getattr()内建函数的调用。
特别调用getattr()以得到默认对象属性(数据属性或者方法)并返回它以便访问或调用。
特殊方法__getattr__()的工作方式是,当搜索一个属性时,任何局部对象首先被找到(定制的对象)。如果搜索
失败了,则__getattr__()会被调用,然后调用getattr()得到一个对象默认行为。
当引用一个属性时,解释器将试着在局部名称空间中查找那个名字,比如一个自定义的方法或局部实例属性。
如果没有在局部字典中找到,则搜索类名名称空间,以防一个类属性被访问。最后,如果两类搜索都失败了,
搜索则对原对象开始授权请求,此时,__getattr__()会被调用。
原文:https://www.cnblogs.com/jinpingzhao/p/12659619.html