反射(*****)python
重點:v = getattr(obj , 「func」) # 根據字符串爲參數(第二個參數),去對象(第一個參數)中尋找與之同名的成員。ide
應用1、首先定義一個handler模塊,handler.py文件內容以下:函數
模塊:測試
def chi(): print("大牛一頓吃100碗飯") def he(): print("大牛一頓喝一桶") def la(): print("大牛很能拉") def shui(): print("大牛一次睡一年") name = "大牛"
test.pyui
引入 import masterspa
蓋特 getattr() 從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量code
孩子 hasattr() 判斷第二個是否在第一個裏面對象
while 1: print("""大牛寫了不少的功能: chi he la shui """) val = input("請輸入你要測試的功能") # he if hasattr(master, val): attr = getattr(master, val) # 從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量 if callable(attr): # 判斷這個鬼東西是否能夠被調用 attr() else: print(attr) else: print("沒有這個功能")
# 把chi函數換成lambda # print(master.chi) # setattr(master, "chi", lambda x: x + 1) # print(master.chi) delattr(master, "la") # 刪除xxx master.la()
蓋特 getattr() 從xxx對象或者模塊中找xxxxx(字符串) 功能, 變量blog
孩子 hasattr() 判斷第二個是否在第一個裏面內存
面向對象的反射:
class Person: def __init__(self, name): self.name = name self.age = None def chi(self): print("人喜歡吃東西%s" % self.name) p = Person("劉偉") val = input("請輸入你想讓劉偉執行的動做:") if hasattr(p, val): getattr(p, "name") func = getattr(p, val) func()
setattr
setattr(p, "name", "大陽哥") # 動態的給對象設置屬性和值 setattr(p, "age", 18) # 不多用. 慎用
delattr 刪除
delattr(p, "age")
反射就是,先定好我要執行什麼功能,而後去你裏面找
總結:
getattr # 根據字符串的形式,去對象中找成員;
hasattr # 根據字符串的形式,去判斷對象中是否有成員;
setattr # 根據字符串的形式,動態的設置一個成員(內存);
delattr # 根據字符串的形式,動態的刪除一個成員(內存);