(重)python---class:以继承的方式包装、以组合的方法授权(__getattr__()功能介绍)
import time #------------------------包装------------------- #包装即以继承的方式完成对基类的方法的第二次开发 class List(list): #举例重写list中的append()方法(需求判断只有string类型的数据才追加在列表中) def append(self, object): if type(object) is str: super().append(object) else: print(只有字符串才可追加) #------------------------授权-------------------- #授权即以组合的方式重写__getattr__()内置方法对原来方法的第二次开发 class Open(): def __init__(self,filename,moder,encodingutf-8): self.fileopen(filename,mode,encodingencoding)#这句话作用组合的方式实例化open为file; self.modemode self.encodingencoding def __getattr__(self, item): return getattr(self.file,item)#说明这个操作的作用将原open-file的权限放开只要当前类没有的方法被调用 #就会触发该函数即就会去寻找self.file对象的所有方法 #所以这句话就可以用作授权如果你没有重写方法就会去找原有方法 # 如果写了就不会触发该函数而是直接用重写的方法下面重写write举例 def write(self,item):#(需求重写文件write方法要求每实现一次write,都要在内容后面加上时间) ttime.strftime(%Y-%m-%d %X) self.file.write(%s%s%(item,t)) if __name__ __main__: #包装 lList(1234567890) l.append(a) l.append(1) print(l) #授权 fileOpen(test.txt,w,encodingutf-8) file.write(这里会直接调用你重写的write方法\n) file.seek(0)#这里会启动__getattr__()去寻找原seek()函数 itemfile.read()#这里会启动__getattr__()去寻找原read()函数,读取文件内容 print(item)注意__getattr__() 与 __getattribute__()不是一个方法__getattribute__()的作用不管你调用的类的属性是否存在都会调用1.当属性存在时调用出属性值2.如果不存在抛出异常调用__getattr__()函数