反射,也叫自省。吾日三省吾身,说白了就是自己检测自己,这就叫反射。千万别被这个抽象的名词给吓到了,没什么牛逼的。
反射的四种方法:
1> hasattr(obj,name) #判断obj.name是否存在,name指代属性,包括数据属性和函数属性。
2> getattr(obj,name) #获取obj.name的结果,如果是函数属性,则加上()即可运行函数。
3> setattr(obj,name,value) #新增或者修改obj.name,且值设置为value
4> delattr(obj,name) #删除obj.name属性
还有三种内置方法:
1> __getattr__(self, item) #当self.item不存在时则触发此函数
2> __setattr__(self, key, value) #当要给设置属性值时触发
3> __delattr__(self, item) #删除某个属性时触发
上面这些属性中最重要的就是__getattr__(self,item)用途最广,用于通过组合方式完成授权。
来段代码吧:
改写文件处理中的write方法:
import time
class Filehandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
self.file=open(filename,mode,encoding=encoding)
self.mode=mode
self.encoding=encoding
def write(self,content):
tm=time.strftime('%Y-%m-%d %X')
self.file.write('%s %s' %(tm,content))
def __getattr__(self, item): #如果直接 f.read()就会触发此处的方法,调用open函数自带的read方法。
return getattr(self.file,item)
f=Filehandle('ownerfile','w',encoding='utf-8')
f.write('hello')
此时打开ownerfile文件的内容是:
2024-08-05 09:09:48 hello
怎么样?就问你牛逼不牛逼!哈哈哈
标签:__,反射,obj,name,item,python,self,encoding,面向对象 From: https://www.cnblogs.com/kkbest/p/18317598