python學習day27 反射 內建的類方法
阿新 • • 發佈:2018-12-20
isinstance(obj,cls) 檢查obj是否是cls類的物件
issubclass(sub,super) 檢查sub類是否是super類的子類
反射
是用字串型別的名字 去操作 變數
為什麼不用eval()?
name = 1 eval('print(name)') # 1
因為eval()操作的是一個字串程式碼,這段字串我們拿過來對立面的資訊什麼都不知道,會有很大的安全隱患
而反射只是通過字串來操作記憶體裡的變數
- setattr
- delattr
- getattr
- hasattr
反射物件的屬性和方法
class A:def func(self): print('in func') a = A() a.name = 'alex' a.age = 63 # 反射物件的屬性 ret = getattr(a, 'name') # 通過變數名的字串形式取到的值 print(ret) # 'alex' print(a.__dict__) # 檢視物件a中的所有屬性 變數名 = input('>>>') # func print(getattr(a, 變數名)) print(a.__dict__[變數名]) #也可以通過這樣來呼叫屬性 # 反射物件的方法 a.func() ret= getattr(a,'func') ret() # 執行方法
反射類的屬性和方法
class A: price = 20 # 靜態屬性 @classmethod def func(cls): print('in func')
# 反射類的屬性 print(getattr(A,'price')) # 反射類的方法 :classmethod staticmethod if hasattr(A,'func'): getattr(A,'func')()
反射模組的屬性和方法
定義模組my.py
day = 'Monday' def wahaha(): print('wahaha')
反射
import my # 反射模組的屬性 print(my.day) print(getattr(my,'day')) # 反射模組的方法 getattr(my,'wahaha')()
反射當前模組的屬性和方法
def qqxing(): print('qqxing') year = 2018 import sys # print(sys.modules['__main__'].year) # sys.modules檢視當前模組的名字 # 反射自己模組中的變數 print(getattr(sys.modules['__main__'],'year')) # 反射自己模組中的函式 getattr(sys.modules['__main__'],'qqxing')() 變數名 = input('>>>') print(getattr(sys.modules[__name__],變數名)) # 一般情況下用__name__變數 獲取當前模組的名字
要反射的函式中有引數怎麼辦?
import time print(time.strftime('%Y-%m-%d %H:%M:S')) # 為時間打上格式 print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S')) # 後面傳參就行了
setattr和delattr (不重要)
# setattr 設定修改變數 class A: pass a = A() setattr(a,'name','nezha') setattr(A,'name','alex') print(A.name) print(a.name) # delattr 刪除一個變數 delattr(a, 'name') print(a.name) # alex delattr(A,'name') print(a.name) # 報錯
__str__和__repr__
__del__
item系列
__getitem__
__setitem__
__delitem__