1. 程式人生 > 實用技巧 >Python中的屬性註冊

Python中的屬性註冊

  在閱讀有些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

  瞭解了這幾個函式,看到圖中這種程式碼就可以秒懂了。