python類-反射

一、反射的概念

反射是指程序可以訪問、檢測和修改它本身狀態或者行爲的一種能力(自省)

二、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方法的內存地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章