在閱讀有些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
了解了這幾個函式,看到圖中這種**就可以秒懂了。
video buffer裡的屬性
記憶體中從0xb8000h起始的一段位址叫做影象快取 video buffer 0xb8000開始的字元位於螢幕左上角,整個螢幕一共25行,80列。每個字元占用兩個位元組,前乙個位元組是ascii碼,後乙個位元組屬性。屬性如下表 bitusage example 7blinking06 backgr...
Spring bean裡的parent屬性
有乙個test的類,裡面有user屬性和setuser user user 方法,現在用spring的ioc,使用到bean裡的parent屬性。testproxy class org.springframework.transaction.interceptor.transactionproxyf...
css裡的position屬性
position屬性是css裡比較常用的乙個屬性,用於設定html頁面中的定位方法但是這個屬性初學者理解起來可能沒怎麼容易,現在我簡單的講一下這個屬性。position屬性指定乙個元素的定位方法的型別,它的值有5個 我學的時候是4個,但是我後來查相關文件時候又多出來乙個 使用了position後可以...