python中的反射
反射
- 原理:在python中萬物皆對象,對象中的全部的屬性和方法都是經過字典形式保存的,若是咱們想得到對象中的某個屬性或方法只須要:
- 首先得到該對象的全部屬性和函數的字典
- 經過鍵key的索引獲取相應的值
class A:
def __init_(self, name):
self.name = name
def func(self):
pass
a = A('a)
setattr(a, 'age', 10)
getattr(a, 'sex', '沒有找到')
hasattr(a, 'age')
delattr(a, 'age')
# 當咱們想經過一個字符串操做對象中的同名的方法時,咱們就能夠經過attr相關的函數操做
msg = input('please enter a method name:') # 在這裏,若是咱們輸入 'func',而後嚮往常同樣調用a.msg,那麼就會報錯說a中沒有msg這個參數,而不是咱們想象中的a.func,另一種狀況就是:a.'func'(),這顯然也不行,由於對象中的func是一個變量,指向一塊內存空間。
# 當咱們應用反射技術時,就能夠實現
# 形式1
if hasattr(a, msg):
getattr(a, msg)()
else:
print('not find')
# 形式2
getattr(a, msg, 'not find')
# 推薦使用形式1
def fun():
pass
def foo():
pass
# 應用, 經過反射的思想調用上面定義的函數,正常狀況下直接:func()
methodName = input('please enter method name:')
# 方法1
import sys
obj = sys.__modules__['__main__]
if hasattr(obj, methodName):
getattr(obj, methodName)
else:
print('not find')
# 方法2,先經過globals()獲取當前模塊的全部屬性和函數的字典,而後經過函數名字的索引獲取相應的地址,再調用函數
globals()[methodName]()