python學習日記(OOP——反射)
阿新 • • 發佈:2018-12-29
反射
反射就是通過字串的形式,匯入模組;通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件(模組)中操作(查詢/獲取/刪除/新增)成員,一種基於字串的事件驅動!
hasattr
判斷物件中是否有這個方法或變數
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li = Person('libai') print(hasattr(li,'name'))#True。因為存在name變數 print(hasattr(li,'walk'))#True。因為存在walk方法 print(hasattr(li,'age'))#False。因為不存在age方法或變數
getattr
獲取物件中的方法或變數的記憶體地址
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li= Person('libai') n = getattr(li,'name')#獲取name變數的記憶體地址 print(n) f = getattr(li,'walk')#獲取walk方法的記憶體地址 f() #呼叫walk方法 #我們發現getattr有三個引數,那麼第三個引數是做什麼的呢? s = getattr(li,'age','not found') print(s) # 列印結果:not find。因為age在物件s中找不到,本應該報錯,屬性找不到,但因為修改了找不到就輸出not find
hasattr、getattr練習
# 通過反射 # 物件名 獲取物件屬性 和 普通方法 # 類名 獲取靜態屬性 和類方法 和 靜態方法
參考原始碼:hasattr_getattr.py
setattr
為物件新增變數或方法
def func(self): print('{} is walking'.format(self.name)) class Person(object): def __init__(self,name): self.name = name li = Person('libai') setattr(li,'walk',func)#將func函式新增到物件li中,並命名為walk li.walk(li) #呼叫walk方法,因為這是額外新增的方法,需要手動傳入物件 setattr(li,'age',28) #新增一個變數age print(li.age) #列印結果
delattr
刪除物件中的變數。注意:不能用於刪除方法
class Person(object): def __init__(self,name): self.name = name def walk(self): print('{} is walking'.format(self.name)) li = Person('libai') delattr(li,'name') #刪除name 變數 print(li.name) #引發異常
反射當前模組成員
name = 'kk' import sys # print(sys.modules) # print(getattr(sys.modules['__main__'],'name')) print(getattr(sys.modules[__name__],'name'))#獲取當前模組的屬性 import time t = input('>>>') #不帶引數,測試輸入:asctime # ti = getattr(time,t) # print(ti()) #帶引數的處理,測試輸入:strftime ti = getattr(time,t)('%Y-%m-%d %H:%M:%S') print(ti)