Python3基础-组合方式完成授权、继承方式完成包装
#super() 函数是用于调用父类(超类)的一个方法
class A: def add(self, x): y = x + 2 print(y) class B(A): def add(self, x): super().add(x) print('BBBBBB') b = B() b.add(2) """ 执行结果如下 4 BBBBBB """
#继承的方式完成包装,包装是一个类型通常是对已存在的类型一些定制。可以新建、修改、删除原有产品的功能,其他的则保持原有的功能
class MyList(list):
#重写list中的append类型 def append(self,value): #覆盖父类 if type(value) is str: #判断,只有str类型才能追加到list里面 super().append(value) else: print('只能存储str类型!') #list() slist= list('hello world') print(slist,type(slist)) #Mylist() mlist = MyList('hello world') print(mlist,type(mlist)) mlist.append(18) mlist.append('18') print(mlist) """ 执行结果如下: ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] <class 'list'> ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] <class '__main__.MyList'> 只能存储str类型! ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '18'] """
#授权,授权是包装的一个特性
#授权的过程,即是所有更新的功能都是由新类的某部分来处理,但是已存在的功能就授权给对象的默认属性
#实现授权的关键点就是覆盖__getattr__方法
import time class Open(): def __init__(self,filename,mode='r',encoding='utf-8'): self.file = open(filename,mode,encoding=encoding) #组合的方式,实例化open方法为:file self.mode = mode self.encoding = encoding def __getattr__(self, item): return getattr(self.file,item) #这句话就可以用作授权;如果你没有重写方法,就会去找原有方法; #如果写了,就不会触发该函数;而是直接用重写的方法,下面重写write举例 def write(self,item): #重写文件write方法,要求每实现一次write,都要在内容后面加上时间 wtime = time.strftime('%b %d %Y %H:%M:%S') self.file.write("%s%s"%(item,wtime)) f1 = Open('a.txt','w+',encoding='utf-8') f1.write('调用重新写的方法\n') f1.seek(0) #启动__getattr__ 寻找原来的seek()方法 value = f1.read() #启动item = f1.read() #启动read()方法 print(value) f1.close() """ 执行结果如下:
调用重新的方法
Nov 18 2019 16:42:49
"""