Python中的屬性註冊

  在閱讀有些Python的開源項目源碼時,會看到某些對象調用了一個方法,但在該對象當中卻又找不到該方法。還可能會看到在調用某個方法是並非直接調用而是使用了getattr這個方法;好在如今IDE比較智能,一般也還可以關聯找獲得該方法;
  調用對象自己沒有存在的方法屬性、間接調用方法,下面看看在Python中這是怎麼回事;
  在Python中有很多內置函數,上面所說的功能正是經過它的內置看書實現的:使用了這麼幾個內置函數:setattr、getattr、hasattr函數;函數

setattr函數

  字面意思,設置屬性值,它的真實做業也只是設置函數值;但它能夠給某個對象設置一個他不存在的屬性而且賦值;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函數

  getattr函數用於獲取屬性、hasattr用於檢測某個屬性是否存在;方法

value = getattr(t, "val")
print(value)

  獲取上面註冊的屬性val,輸出值爲5;
獲取不存在的屬性會拋出異常,此時可以使用hasattr函數用於判斷屬性是否存在,再作下一步處理;im

hasattr(t,"mul")
返回False
hasattr(t,」va」)
返回True

  瞭解了這幾個函數,看到圖中這種代碼就能夠秒懂了。

相關文章
相關標籤/搜索