python動態添加類對象成員:變量、函數

2021-01-14 科技研究員猴哥

一般類對象新增變量或方法的過程

在面向對象(OOP)的編程方法中,如果需要給實例化的類對象新增方法或者屬性,一般都是在class類的定義中新增內容,然後才能用類對象來調用新增的方法或變量。如在C++中:

C++示例類

如果此時開發人員需要為類對象p新增一個變量age和一個方法weigh()都是通過修改類的原始定義:

C++類新增成員

然而在python中給類對象新增變量或者方法並不需要對原始類定義進行重新修改,隨時都可以給類對象新增成員。

pythonyu'yan

那麼下面就以下圖中的代碼為例,為大家演示如何給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編程中作用明顯,希望本文內容有助於讀者學習/工作!最後感謝您的閱讀!

謝謝

相關焦點

  • Python教程:動態變量名定義與調用
    動態變量名賦值 在使用tkinter時需要動態生成變量,如動態生成var1...var10變量 使用exec動態賦值 exec在python3中是內置函數,它支持python代碼的動態執行。
  • Python 動態生成變量名以及動態獲取變量的變量名
    【導語】:必須現在需要動態創建16個list,每個list的名字不一樣,但是是有規律可循,比如第一個list的名字叫:arriage_list_0=[],第二個叫arriage_list_1=[]……..依次類推,但是我又不想手動的去寫16個這樣的名字,太累了,而且增加了代碼的冗餘性,靈活性也不強,所以有沒有一種方法是能動態創建list名稱的呢?
  • Python -- 函數對象
    一、函數對象函數是第一類對象:值的內存地址可以像變量一樣去使用def foo():#foo=函數的內存地址,可以當做一種變量值去使用1、函數可以被引用def foo():  print('(x):  return(x)f=func(foo)print(f)4.可以當做容器類的元素def foo():  print('hello')dic={'1':foo}print(dic)dic['1'](https://www.cnblogs.com/zhuyuanying123--/p
  • Python 類和對象初步入門
    Python 語言在設計之初,就定位為一門面向對象的程式語言,「Python 中一切皆對象」就是對 Python 這門程式語言的完美詮釋。類和對象是 Python 的重要特徵,相比其它面向對象語言,Python 很容易就可以創建出一個類和對象。同時,Python 也支持面向對象的三大特徵:封裝、繼承和多態。
  • Python基礎知識:什麼是類?有什麼作用?老司機帶你定義自己的類
    Python是一門高級語言,所以一開始設計具備面向對象的特性。對於大家來說類的出現使得大家開發的更加的方便,可以實現代碼復用,代碼更加抽象,閱讀起來也十分的方便。類有什麼特徵呢?可繼承、方法重寫、變量成員及屬性、還有就是需要實例化等等。
  • python函數 eval函數—將字符串變成可執行的代碼
    globals -- 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。locals -- 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。返回值返回表達式計算結果。eval()使用原因:1.在編譯語言裡要動態地產生代碼,基本上是不可能的,但動態語言是可以,意味著軟體已經部署到伺服器上了,但只要作很少的更改,只好直接修改這部分的代碼,就可立即實現變化,不用整個軟體重新加載。2.在machin learning裡根據用戶使用這個軟體頻率,以及方式,可動態地修改代碼,適應用戶的變化。
  • Python 變量類型
    以下幾個內置的函數可以執行數據類型之間的轉換。這些函數返回一個新的對象,表示轉換的值。函數描述int(x [,base])將x轉換為一個整數long(x [,base] )將x轉換為一個長整數float(x)將x轉換到一個浮點數complex(real [,imag])創建一個複數str(x)將對象 x 轉換為字符串repr
  • python教程之十一面向對象
    面向對象技術簡介不管何種語言,我們都提倡採用面向對象思想編程。上節我們介紹了GUI界面,下面代碼採用tkinter庫實現登陸界面來解釋說明面向對象技術涉及到的幾個術語。1、類(Class): 具有相同屬性和方法的對象的集合。定義了Login類,類定義的語法為 class className:2、方法:類中定義的函數。
  • python中使用pycharm變量與程序調試
    本節知識視頻教程文字講解開始:一、python變量變量:可以變化的數據量。數據量:包含所有的數據類型,字符串、整型、布爾型、浮點型等。打個比方:框。框上的標籤就是變量的名稱,框中可以放對應標籤的東西。深層理解:變量的使用,都是在使用內存空間。每聲明一個變量都會使用一定的內存空間。
  • 零基礎小白學python入門——面向對象基礎(建議收藏)
    對象可以使用屬於它的普通變量來存儲數據。這種從屬於對象或類的變量叫作欄位 (Field)。對象還可以使用屬於類的函數來實現某些功能,這種函數叫作類的方法 (Method)。這兩個術語很重要,它有助於我們區分函數與變量,哪些是獨立的,哪些又是 屬於類或對象的。
  • 全局變量和成員變量的區別分析
    depart; //類變量final String design=「yangzi」; //常量}   代碼中的實例變量、類變量、常量都屬於成員變量,那麼其區分的依據是什麼?   變量分為局部與全局,局部變量又可稱之為內部變量。由某對象或某個函數所創建的變量通常都是局部變量,只能被內部引用,而無法被其它對象或函數引用。   全局變量既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變量是可以被本程序所有對象或函數引用。一個局部變量在被其它對象引用時,會是一個空值。但全局變量卻不會出現這種情況。
  • python 特殊變量,直接使用
    __annotations__:註解,一般用不到__builtins__:內建對象,一般用不到__loader__:導入系統加載模塊時的對象,一般用不到下面我們根據 函數、類、模塊來分別舉例說明pkg包下面的 model.py 文件函數中的用法:函數內部和外部獲取 函數名
  • 初識Python面向對象
    此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數二、面向對象編程1.2種形式:新式類和經典類,上面代碼中的Hero為新式類,前兩行注釋部分則為經典類;object 是Python 裡所有類的最頂級父類;類名 的命名規則按照"大駝峰命名法";info 是一個實例方法,第一個參數一般是self,表示實例對象本身,當然了可以將self換為其它的名字,其 作用是一個變量 這個變量指向了實例對象.
  • python 函數定義以及函數的調用
    函數的調用1. 函數參數函數定義之後,那函數裡面可以傳入哪些對象呢?在python中參數無類型,參數可以接受任意對象,只有函數中代碼才會對參數類型有限制4.2.默認參數:在函數調用的時候,默認參數可以不傳入值,不傳入值時,會使用默認參數3.不定長參數(動態參數):在函數調用的時候,不定長參數可以不傳入,也可以傳入任意長度。
  • Python使用ctypes模塊調用DLL函數之傳遞結構體參數
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢
  • 詳解Python面向對象知識點
    目前代碼技能已經成了測試同學面試考核的剛需,對於測試開發來講需求最大的是java和python兩門語言,二者也都是面向對象語言。對於剛入門代碼的同學來說面向對象相關的概念比較難於理解,而面向對象編程相關的知識點偏偏又是面試中的高頻問題,所以本文我以python為例,帶大家快速搞定面向對象中的核心概念並通過代碼實現的方式來幫助大家對其加深理解!
  • Python基礎教程(一) - 快速入門
    /usr/bin/python為Linux系統下Python解釋器的路徑,通常python解釋器的路徑安裝在/usr/local/bin或/usr/bin目錄下。程序輸入和raw_input()內建函數從用戶得到數據輸入的最好方式使用raw_input()函數,它讀取標準輸入,並將讀取到的數據賦值給指定的變量。
  • python核心部分創建對象中各種名詞的定義及用法
    學了之前的基礎之後你會發現你基本上可以寫出很多小程序來了,包括用序列,字典,數字,字符串來創建函數,基本上可以完成你遇到的問題。但是python被稱為面向對象的語言,所以創建對象才是python的核心部分,我們今天就走進python的核心部分-創建對象。
  • 了解python變量類型,曉得python變量命名規則,學習python第1天
    想學習python,首先就需要了解python用來存儲數據的載體是什麼?而它就是變量,那python變量類型有哪幾種呢?python變量命名規則又有哪些?下面羽憶教程為你介紹。python變量命名規則python變量就跟我們每個人一樣,都需要擁有一個名字讓別人記住你,就像說起華為,你會想到華為創始人任正非一樣。python變量也需要有一個名字來區分,而python變量命名規則有哪些呢?
  • python 列表推導式和生成式,部分內置函數
    整體說明:凡是用列表推導式構造的列表對象,用其他方式都可構建,但非常複雜的列表,列表推導式是構建不出的,分類:[變量(加工後的變量) for 變量 in iterable] 循環模式[變量(加工後的變量) for 變量 in iterable if 條件] 篩選模式二、生成表達式生成器有兩種方式:1、生成器函數