【目錄】
1、什么是反射
2、為何要用反射
3、如何實作反射
1、什么是反射
python是動態語言,而反射(reflection)機制被視為動態語言的關鍵,
反射機制指的是在程式的運行狀態中
對于任意一個類,都可以知道這個類的所有屬性和方法;
對于任意一個物件,都能夠呼叫他的任意方法和屬性,
這種動態獲取程式資訊以及動態呼叫物件的功能稱為反射機制,
2、為何要用反射
為了動態獲取程式資訊以及動態呼叫物件,,
3、如何實作反射
(1)在python中實作反射非常簡單,在程式運行程序中,如果我們獲取一個不知道存有何種屬性的物件,
若想操作其內部屬性,可以先通過內置函式dir來獲取任意一個類或者物件的屬性串列,串列中全為字串格式
class People: def __init__(self,name,age): self.name=name self.age=age def say(self): print('<%s:%s>' %(self.name,self.age)) obj=People('辣白菜同學',18) # 實作反射機制的步驟 # 1、先通過多dir:查看出某一個物件下可以.出哪些屬性來 print(dir(obj)) # 2、可以通過字串反射到真正的屬性上,得到屬性值 print(obj.__dict__[dir(obj)[-2]]) # 輸出結果: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'say'] 辣白菜同學
(2)接下來就是想辦法通過字串來操作物件的屬性了,這就涉及到內置函式hasattr、getattr、setattr、delattr的使用了(Python中一切皆物件,類和物件都可以被這四個函式操作,用法一樣)
內置函式
hasattr()判斷物件是否有該屬性
getattr()獲取物件屬性
setattr()修改物件屬性
delattr()洗掉物件屬性
class Teacher: def __init__(self,full_name): self.full_name =full_name t=Teacher('Egon Lin') # hasattr(object,'name') hasattr(t,'full_name') # 按字串'full_name'判斷有無屬性t.full_name # getattr(object, 'name', default=None) getattr(t,'full_name',None) # 等同于t.full_name,不存在該屬性則回傳默認值None # setattr(x, 'y', v) setattr(t,'age',18) # 等同于t.age=18 # delattr(x, 'y') delattr(t,'age') # 等同于del t.age
(3)應用——基于反射可以十分靈活地操作物件的屬性,比如將用戶互動的結果反射到具體的功能執行
obj=10 if hasattr(obj,'x'): print(getattr(10,'x')) else: pass print(getattr(obj,'x',None)) if hasattr(obj,'x'): setattr(obj,'x',111111111) # 10.x=11111 else: pass class Ftp: def put(self): print('正在執行上傳功能') def get(self): print('正在執行下載功能') def interactive(self): method=input(">>>: ").strip() # method='put' if hasattr(self,method): getattr(self,method)() else: print('輸入的指令不存在') obj=Ftp() obj.interactive() # 運行結果: # None # >>>: put # 正在執行上傳功能 # # 行程已結束,退出代碼 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/158679.html
標籤:Python
上一篇:十、Python入門-多執行緒
