什么是授权
实现授权是包装的一个特性。包装一个类型通常是对已存在的类型进行一些自定义定制,这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变。授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性。
实现授权的关键点是覆盖__getattr__()方法,在代码中包含一个对getattr()内建函数的调用,调用getattr()得到默认对象的属性,并返回它以便访问或者调用。
代码示例
功能描述
自定义了一个类,它不具备一个功能
但是通过内部的操作,让使用者会以为这个类对象具备该功能
# 我是卖耳机的
# 有一个消费者,在我这买了一个耳机
# 顺带说了一句,我还要买音响,你们店有卖?
# 商家会说有卖(实际上没有)
# 商家接单以后,把这个业务转给卖音响的人处理,中间商(赚差价?)
class DataHandel:
""" 数据处理类 """
def __init__(self):
self.data = [1,2,3]
self.file = open("a.txt", "w+", encoding="utf8") # 文件对象
def read_data(self):
print(self.data)
def __getattr__(self, item): # item = "write"
# 我有对象,我有一个字符串的标识符名称 对象, "属性名"
# 期望实现 对象.属性
# func = getattr(文件对象, "write") --- >
# func = 文件对象.write
# 文件对象.write() ---- > func()
func = getattr(self.file, item)
return func
db = DataHandel()
db.read_data()
# 需要你帮我保存数据到文件中
# res = db.write
db.write("在不在")
# res("你好啊")# 文件对象.write("你好啊")
# res = db.__getattr__("write")
# # res = func = 文件对象.write # 文件对象.write(内容) =》 res(内容)
# print(res)
# res("haha") # func("haha") # func("haha") ==> 文件对象.write("haha")
# # self.file.write("haha") # 文件对象.write("haha")