# 实现授权是包装的一个特性。包装一个类型通常是对已存在的类型进行一些自定义定制, # 这种做法可以新建,修改,或删除原有产品的某些功能,而其他的保持不变。 # 授权的过程,其实也就是所有的更新功能都交给新类的自定义的某部分功能来处理,但已存在的功能就授权给对象的默认属性。 class List(list): def append(self, object):#append添加的列表必须是字符串类型 print(object) if type(object) is str: #包装标准类型实现功能 # list.append(self,object) super().append(object) else: print("只能添加字符串") def show_midle(self): midel_index=int(len(self)/2) return self[midel_index] # l2=list("hello world") # print(l2,type(l2)) ll=List("helloworld") print(ll,type(ll)) print(ll.show_midle()) ll.append("111") print(ll)
#授权:授权是包装的一个特性,包装一个类型通常是对已存在的类型的一些定制 #这种方法,可以新建,修改或删除原有产品的功能,其他的则保持原样,授权的过程,及是所有更新的功能都是由新类 #的某部分来处理,但已存在的功能就授权给对象的默认属性 #实现授权的关键点是覆盖__getattr__方法 import time class Filehandle(): def __init__(self,filename,mode="r",encoding="utf-8"): self.mode=mode self.filename=open(filename,mode,encoding=encoding) self.encoding=encoding # def read(self): # pass # # def write(self): # pass # def write(self,line): # # print("----------->",line) # t=time.strftime("%Y-%m-%d %X") # self.filename.write(("%s %s"%(t,line) )) def __getattr__(self, item): print(item,type(item)) return getattr(self.filename,item)#self.filename 内存地址 item(read方法 str类型) f1=Filehandle("a.text","w+","utf-8") # print(f1.filename) # print(f1.__dict__) # print(type(f1.read()))#触发__getattr__ f1.write("11 ") f1.write("cpu负载过高 ") f1.write("内存剩余不足 ") f1.write("硬盘剩余不足 ") f1.seek(0) print(f1.read()) # sys_f=open("b.text","w") # print(getattr(sys_f,"read"))