在閱讀有些Python的開源項目源碼時,會看到某些對象調用了一個方法,但在該對象當中卻又找不到該方法。還可能會看到在調用某個方法是並非直接調用而是使用了getattr這個方法;好在如今IDE比較智能,一般也還可以關聯找獲得該方法;
調用對象自己沒有存在的方法屬性、間接調用方法,下面看看在Python中這是怎麼回事;
在Python中有很多內置函數,上面所說的功能正是經過它的內置看書實現的:使用了這麼幾個內置函數:setattr、getattr、hasattr函數;函數
字面意思,設置屬性值,它的真實做業也只是設置函數值;但它能夠給某個對象設置一個他不存在的屬性而且賦值;code
class Ten: def __init__(self, data): print("init") def register(name, fn): setattr(Ten, name, fn)
上面定義了一個類,該類並無屬性或除了init方法外其餘的方法;定義一個register方法,該方法用於向Ten類中註冊屬性、方法;對象
t = Ten()
調用register方法,註冊屬性val,值爲5;blog
register("val", 5) print(t.val)
打印輸出註冊的屬性val值:5;get
定義一個新類:Ops源碼
class Ops: @staticmethod def add(x, y): return x + y
在Ten類中註冊ops屬性,值爲剛定義的類Ops;it
register("ops", Ops) value= t.ops.add(1, 2) print(value)
此時能夠經過註冊的屬性ops調用該屬性的方法;class
getattr函數用於獲取屬性、hasattr用於檢測某個屬性是否存在;方法
value = getattr(t, "val") print(value)
獲取上面註冊的屬性val,輸出值爲5;
獲取不存在的屬性會拋出異常,此時可以使用hasattr函數用於判斷屬性是否存在,再作下一步處理;im
hasattr(t,"mul") 返回False hasattr(t,」va」) 返回True
瞭解了這幾個函數,看到圖中這種代碼就能夠秒懂了。