一、反射的概念
反射是指程序可以訪問、檢測和修改它本身狀態或者行爲的一種能力(自省)
二、python中反射的四個函數
hasattr(object,name)
可以檢查一個對象之中是否有該屬性,若存在返回True,不存在則返回False,name必須爲字符串類型。getattr(object,name,default=None)
可以獲得一個對象的屬性值,若存在則直接返回值;不存在則會報錯,如果設置了default,那麼會返回default。setattr(object,name,value)
可以爲一個對象設置新增屬性,或者修改原屬性的值。delattr(object,name)
三、反射的實際應用
反射可以實現先定義好接口,接口只有在被完成之後纔會真正執行,這實現了即插即用,完成一種後期綁定
# 某個ftp類還沒有實現具體功能
class Ftpclient:
def __init__(self,addr):
print('正在連接服務器[%s]'%addr)
self.addr = addr
# 因此可以設定一個邏輯,若有此方法的時候執行,沒有這個方法就跳過
f1 = FtpClient('192.168.1.1')
if hasattr(f1,'get')
func_get = getattr(f1,'get')
func_get()
else:
print('不存在此方法')
四、反射函數的實現的內置方法
__getattr__
class Foo:
x = 1
def __init__(self,y):
self.y = y
# 重寫__getattr__方法
def __getattr__(self,item):
print('執行__getattr__')
getattr(f1,'y')
#沒有任何返回
getattr(f1,'z')
#執行__getattr__
#__getattr__方法只有在尋找一個不存在的屬性時纔會執行
__setattr__
class Foo:
x = 1
def __init__(self,y):
self.y = y
# 重寫__setattr__方法
def __setattr__(self,key,value):
print('執行__setattr__')
#self.key = value 此種方法會引起無限遞歸
self.__dict__[key] = value
#賦值操作的本質是對底層的字典進行賦值操作
__delattr__
def __setattr__(self,item):
print('執行__delattr__')
self.__dict__.pop(item)
重寫反射方法的應用實例
包裝文件讀寫方法
class FileHandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
#類初始化拿到文件句柄
self.file = open(filename,mode,encoding=encoding)
self.mode = mode
self.encodeing = encoding
def __getattr__(self,item):
return getattr(self.file,item)
f1 = FileHandle('a.txt','r+')
f1.write('111111\n')
#f1實例本身沒有wirte方法————》轉到__getattr__方法中
#在getattr,返回f1.file文件句炳中write方法的內存地址