Python中的屬性註冊
阿新 • • 發佈:2020-11-28
在閱讀有些Python的開源專案原始碼時,會看到某些物件呼叫了一個方法,但在該物件當中卻又找不到該方法。還可能會看到在呼叫某個方法是並不是直接呼叫而是使用了getattr這個方法;好在現在IDE比較智慧,通常也還能夠關聯找得到該方法;
呼叫物件本身沒有存在的方法屬性、間接呼叫方法,下面看看在Python中這是怎麼回事;
在Python中有不少內建函式,上面所說的功能正是通過它的內建看書實現的:使用了這麼幾個內建函式:setattr、getattr、hasattr函式;
setattr函式
字面意思,設定屬性值,它的真實作業也只是設定函式值;但它可以給某個物件設定一個他不存在的屬性並且賦值;
class Ten:
def __init__(self, data):
print("init")
def register(name, fn):
setattr(Ten, name, fn)
上面定義了一個類,該類並沒有屬性或除了init方法外其他的方法;定義一個register方法,該方法用於向Ten類中註冊屬性、方法;
t = Ten()
呼叫register方法,註冊屬性val,值為5;
register("val", 5)
print(t.val)
列印輸出註冊的屬性val值:5;
定義一個新類:Ops
class Ops: @staticmethod def add(x, y): return x + y
在Ten類中註冊ops屬性,值為剛定義的類Ops;
register("ops", Ops)
value= t.ops.add(1, 2)
print(value)
此時可以通過註冊的屬性ops呼叫該屬性的方法;
getattr、hasattr函式
getattr函式用於獲取屬性、hasattr用於檢測某個屬性是否存在;
value = getattr(t, "val")
print(value)
獲取上面註冊的屬性val,輸出值為5;
獲取不存在的屬性會丟擲異常,此時可使用hasattr函式用於判斷屬性是否存在,再做下一步處理;
hasattr(t,"mul") 返回False hasattr(t,”va”) 返回True
瞭解了這幾個函式,看到圖中這種程式碼就可以秒懂了。