python需要什么包装_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\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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值