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,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)#说明:这个操作的作用,将原open-file的权限放开;只要当前类没有的方法被调用,
#就会触发该函数;即,就会去寻找self.file对象的所有方法;
#所以,这句话就可以用作授权;如果你没有重写方法,就会去找原有方法;
# 如果写了,就不会触发该函数;而是直接用重写的方法,下面重写write举例
def write(self,item):#(需求:重写文件write方法,要求每实现一次write,都要在内容后面加上时间)
t=time.strftime("%Y-%m-%d %X")
self.file.write("%s%s"%(item,t))
if __name__ == '__main__':
#包装
l=List("1234567890")
l.append("a")
l.append(1)
print(l)
#授权
file=Open("test.txt","w+",encoding="utf-8")
file.write("这里会直接调用你重写的write方法\n")
file.seek(0)#这里会启动__getattr__()去寻找原seek()函数
item=file.read()#这里会启动__getattr__()去寻找原read()函数,读取文件内容
print(item)
注意:__getattr__() 与 __getattribute__()不是一个方法;
__getattribute__()的作用:不管你调用的类的属性是否存在,都会调用;1.当属性存在时,调用出属性值,2.如果不存在,抛出异常,调用__getattr__()函数;