实现授权的关键点就是覆盖__getattr__()方法,在代码中包含一个对getattr()内建函数的调用。
特别调用getattr()以得到默认对象属性(数据属性或者方法)并返回它以便访问或调用。
特殊方法__getattr__()的工作方式是,当搜索一个属性时,任何局部对象首先被找到(定制的对象)。如果搜索
失败了,则__getattr__()会被调用,然后调用getattr()得到一个对象默认行为。
当引用一个属性时,解释器将试着在局部名称空间中查找那个名字,比如一个自定义的方法或局部实例属性。
如果没有在局部字典中找到,则搜索类名名称空间,以防一个类属性被访问。最后,如果两类搜索都失败了,
搜索则对原对象开始授权请求,此时,__getattr__()会被调用。
授权(也是一种包装,关键点是覆盖__getattr__方法)
基于基本类型定制自己的类型
import time
class FileHandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
# self.filename=filename
self.file=open(filename,mode,encoding=encoding) #组合
self.mode=mode
self.encoding=encoding
def write(self,line):
print('------------>',line)
t=time.strftime('%Y-%m-%d %X')
self.file.write('%s %s' %(t,line))
def __getattr__(self, item):
# print(item,type(item))
# self.file.read
return getattr(self.file,item)
f1=FileHandle('a.txt','w+')
# print(f1.file)
# print(f1.__dict__)
# print('==>',f1.read) #触发__getattr__
# print(f1.write)
f1.write('1111111111111111\n')
f1.write('cpu负载过高\n')
f1.write('内存剩余不足\n')
f1.write('硬盘剩余不足\n')
# f1.seek(0)
# print('--->',f1.read())
包装
二次加工标准类型(包装继承加派生实现)
class List(list):
def append(self, p_object):
if type(p_object) is str:
# self.append(p_object) #导致无限递归
super().append(p_object)
else:
print('只能添加字符串类型')
def show_midlle(self):
mid_index=int(len(self)/2)
return self[mid_index]
# l2=list('hell oworld')
# print(l2,type(l2))
l1=List('helloworld')
# print(l1,type(l1))
# print(l1.show_midlle())
l1.append(1111111111111111111111)
l1.append('SB')
print(l1)