版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
文章目录
1、包装
-
包装一个类型通常是对已存在的类型进行一些自定义定制,这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变。
-
包装是用继承的方式完成的
2、包装list类,增加新功能
包装一个类型通常是对已存在的类型进行一些自定义定制,这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变。
包装list类,使其append方法只能增加字符串
class StrList(list):
def append(self, p_object):
if type(p_object) is str:
super().append(p_object)
else:
print("【%s】不是字符串"%p_object)
if __name__ == '__main__':
strList=StrList()
strList.append("abc")
print(strList)
strList.append(1) #非字符串无法新增
print(strList)
2、授权
- 授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性。
- 授权的关键点时覆盖__getattr__方法
- fileHandle调用read方法时,FileHandle类中无此方法,就会触发
__getattr__
方法 __getattr__
返回了self.file
的内存地址,故可以访问一切方法- fileHandle调用write方法时,FileHandle类中有此方法,故不会触发
__getattr__
方法
#这个类写入时前面会加入时间
#其他功能和IO功能一致
import time
class FileHandle:
def __init__(self, fileName, mode="w", encoding="utf-8"):
self.file = open(fileName, mode, encoding=encoding)
def write(self, str):
t = time.strftime("%Y-%m-%d %X")
self.file.write("%s %s" % (t, str))
def __getattr__(self, item):
#print(getattr(self.file, item))
return getattr(self.file, item)
if __name__ == '__main__':
fileHandle = FileHandle("a.txt")
fileHandle.write("锄禾日当午")
运行结果如下