python中的「反射」

python中的反射

反射

  • 原理:在python中萬物皆對象,對象中的全部的屬性和方法都是經過字典形式保存的,若是咱們想得到對象中的某個屬性或方法只須要:
    1. 首先得到該對象的全部屬性和函數的字典
    2. 經過鍵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]()
相關文章
相關標籤/搜索