python学习之包装与授权

实现授权的关键点就是覆盖__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 ')
f1.write('cpu负载过高 ')
f1.write('内存剩余不足 ')
f1.write('硬盘剩余不足 ')
# 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)

原文地址:https://www.cnblogs.com/jinpingzhao/p/12659619.html