一般類對象新增變量或方法的過程
在面向對象(OOP)的編程方法中,如果需要給實例化的類對象新增方法或者屬性,一般都是在class類的定義中新增內容,然後才能用類對象來調用新增的方法或變量。如在C++中:
如果此時開發人員需要為類對象p新增一個變量age和一個方法weigh()都是通過修改類的原始定義:
然而在python中給類對象新增變量或者方法並不需要對原始類定義進行重新修改,隨時都可以給類對象新增成員。
那麼下面就以下圖中的代碼為例,為大家演示如何給python中的類對象動態的添加變量/屬性和方法:
給類對象動態添加成員變量
Python 支持為已創建好的對象動態增加實例變量而不會改變類的原始定義!方法很簡單,只需要給類對象的新變量賦值即可,如給示例代碼中的對象p新增性別變量sex:
# 為p對象增加一個sex實例變量,直接聲明即可 p.sex = "男" print(p.sex) 運行結果為:男
上述代碼為 p 對象動態新增了一個 sex實例變量,即直接對p對象的sex實例變量賦值就能新增一個實例變量。那麼如何刪除這個動態變量呢?
python也支持動態刪除實例變量,使用del語句即可刪除,如刪除類對象p的name成員變量:
# 刪除p對象的name實例變量 del p.name# 再次訪問p的name實例變量 print(p.name) 運行結果為:lisi
上述代碼使用del動態刪除了已經創建好的 p 對象的 name 實例變量,但因類中定義了類變量 name,故程序不會報錯;否則會報出 AttributeError 錯誤,並提示:'Person' object has no attribute 'name'。
給類對象動態添加方法/函數
注意:初學者在理解以下內容之前,需清楚python類中 self 參數的含義和作用,可自行搜索查閱:Python中self的用法!
Python 同時支持為類對象動態新增方法,示例代碼中的Person類只定義了一個 height() 方法,而實際使用時,開發人員完全可以為p對象動態增加方法:
說明:為p對象動態增加方法時,Python 不會自動將調用者自動綁定到類方法的第一個參數self(即使將第一個參數命名為 self 也沒用)。通俗的說就是雖然代碼形式上(p.weigh())聲明了對象p的新方法,但實際上python並不知道該方法是屬於對象p的成員方法,需要用代碼p.weigh(p)來手動綁定方法weigh()為對象p的新方法。
另一種實現上述綁定功能的方法:使用MethodType模塊
def intro_func(self, content): print("("我是一個人")# 導入MethodTypefrom types import MethodType # 使用MethodType對intro_func進行包裝,將該函數的第一個參數綁定為p p.intro = MethodType(intro_func, p)# 第一個參數已經綁定了,無需傳入 p.intro("新增了方法intro,功能由intro_func()實現")
上述代碼中,通過 MethodType 包裝 intr_func 函數之後,為p對象動態增加的 intro() 方法的第一個參數self就綁定了對象p,因此程序在調用intro() 方法時就自動將intro方法歸為p對象的成員方法,而無須傳入第一個參數self,功能與在定義Person類時己經定義了 intro() 方法一樣。
完整代碼演示
總結
為類對象動態添加成員變量或成員方法是python類操作中非常人性化的設計,在python編程中作用明顯,希望本文內容有助於讀者學習/工作!最後感謝您的閱讀!