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

2020-12-07 科技研究員猴哥

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

在面向對象(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基礎教程(一) - 快速入門
    程序輸入和raw_input()內建函數從用戶得到數據輸入的最好方式使用raw_input()函數,它讀取標準輸入,並將讀取到的數據賦值給指定的變量。變量名僅僅是一些字符開頭的標識符--意指大寫或者小寫字母,另外還包括下劃線(_)。變量名是大小寫敏感的。'case'和'CaSe'是兩個不同的變量。Python是動態類型語言,不需要預先生命變量類型。數字&字符串Python支持五種基本數字類型,其中有三種整形類型。
  • 打基礎一定要吃透這12類 Python 內置函數
    內置函數就是python給你提供的, 拿來直接用的函數,比如print.,input等。截止到python版本3.6.2 python一共提供了68個內置函數,我將它們分成 12 類,方便你學習。1. 和數字相關1.
  • python中類的繼承和多態
    類的繼承類繼承語法:Class 派生類名(基類名): #基類名寫在括號裡派生類成員在繼承關係中,已有的,設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
  • 淺談動態類型領域中 Python 的變量、對象以及引用
    比如在 Python 中使用變量的時候不需要提前聲明變量及其類型,而且變量不會報錯,這在之前學習靜態語言的同學眼裡是不可思議的,他們會有「這種情況下 Python 怎麼知道變量是什麼」等諸如此類的問題,這樣的問題其實已經是進入了「動態類型」的領域了,Python 中類型是在程序運行過程中自動決定的。
  • 【4】類的繼承和多態-簡易的Python面向對象教程
    面向對象(2) - 實例方法 (本文) 面向對象(3) - 類屬性和類方法 面向對象(4) - 繼承和多態,以及一個綜合小遊戲案例
  • 三分鐘從入門到精通——Python模塊
    您花了30分鐘來定義一個函數,然後使用它並退出解釋器。但是突然間,您記住仍然需要再次使用該功能。您再次輸入它,但該功能的定義已消失。哎呀,好痛。現在,您再次需要花費30分鐘來鍵入相同的功能。因此,python有一種方法可以將該函數定義放入文件中並隨時使用。模塊是ModuleType類型的對象。
  • Python數據類型串講(中)
    python中的內建序列有6種:列表、元祖、字符串、Unicode字符串、xrange對象、buffer對象,其中列表和元祖是最常見的序列,應重點掌握。字符串在上一篇文章中已簡單介紹,下面將以字符串為例,對序列的通用操作進行詳講。
  • Python程式設計師最常犯的10個錯誤,你中招了嗎?
    大數據文摘作品編譯:什錦甜、Gao Ning、小魚Python簡介Python是一種具有動態語義的、面向對象的解釋型高級程式語言。因其內置了高級數據結構,並支持動態類型和動態綁定,使用Python進行快速應用程式開發十分便利。
  • python教程之python數學運算
    模塊是由別人寫的,並且可以被拿來直接使用的代碼程序,包括類、函數以及標籤的定義,是python標準函數庫的一部分。使用是必須先插入模塊。>>> from fractions import Fraction #插入模塊>>> f =Fraction(1,2) #創建Fraction 類,並初始化為1/2>>> f #輸出分數類對象Fraction(1, 2)#輸入分數Fraction開頭字母必須大寫
  • Print在python中充當了什麼角色?變量和賦值語句又是什麼?
    在前篇我們講了python的數據類型,眾所周知,數據是計算機用來做運算用的,運算出來以後,得把結果輸出在計算機裡。那麼python是怎麼把結果輸出到計算機中的呢基本輸出函數 print。其結果如下:當我們的數據很小的時候,可以直接用表達式進行運算,但是當我們的程序代碼量非常多的時候,需要一個中間值,這就需要一個變量(variable)。那麼什麼是變量呢?變量是用來綁定數據對象的標誌符。變量名的命名方法主要有以下幾種:a:變量名必須為字母或下劃線開頭,後跟字母或下劃線或數字。
  • python基礎課程 第5章 奇妙的內建函數
    今天我們來講講 python 的常用內建函數,以便於大家在日常編程過程中遇到類似的場景可以直接拿來使用,不用再重複自己了。python 內建函數(python自帶的函數) 數量加起來大概有70多個,今天我們主要講常用的一些,至於更多的內容可以在以後的基礎教程裡慢慢學到。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • 乾貨| 完美Python入門基礎知識點總結
    以單下劃線開頭 _foo 的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用 from xxx import * 而導入;以雙下劃線開頭的 __foo 代表類的私有成員;以雙下劃線開頭和結尾的 __foo__ 代表 Python 裡特殊方法專用的標識,如 __init__() 代表類的構造函數。
  • python迭代器和生成器總結——新的斐波那契數列
    for循環遍歷結果事實上,python中,提供了另一個工具來幫助遍歷,該工具稱之為迭代器。可以通過iter函數來獲取一個迭代器,通過next函數來獲取下一個元素。如下:事實上,for循環能夠正常運行的基礎,就是因為相應的類實現了迭代器。換句話說,假設有一個我們自己定義類,想讓for循環可以作用於該類的對象,就需要為該類實現迭代器。一種實現方式是提供兩個方法,分別是__iter__和__next__。
  • 寫Python 代碼不可不知的函數式編程技術
    頭等函數在 Python 中,函數是「頭等公民」(first-class)。也就是說,函數與其他數據類型(如 int)處於平等地位。因而,我們可以將函數賦值給變量,也可以將其作為參數傳入其他函數,將它們存儲在其他數據結構(如 dicts)中,並將它們作為其他函數的返回值。
  • 面向對象特性之三:多態(Python進階教程)
    今天我們要講一講面向對象的第三個特性:多態;什麼叫做多態?從字面意思上理解,就是一個函數具有多種形態。本質上其實就是同一操作方法作用於不同的對象時,有著不同的解釋,執行不同的邏輯,產生不同的結果。這兩個類是「部門類」的子類,下面我們用代碼來表示一下這三個類:在上例中,我們定義了三個類,主類叫做「部門類」,兩個子類繼承於該類,分別代表「海運部門」和「空運部門」,這兩個類除了都有自己的構造函數之外,還有著一個具有相同名稱的方法,我們暫且叫做「送貨」方法。
  • Python 爬蟲面試題 170 道:2019 版
    11.例舉你知道 Python 對象的命名規範,例如方法或者類等12.Python 中的注釋有幾種?13.如何優雅的給一個函數加注釋?14.如何給變量加注釋?15.Python 代碼縮進中是否支持 Tab 鍵和空格混用。
  • python測試函數模塊unittest
    return full_name.title()test_name_function.py 模塊名import unittest unittest是python標準庫中的函數不可更改但可以用as重新命名調用函數unittest模塊from name_function import get_formatted_name
  • 變量被析構函數釋放的時候的注意事項
    本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】經微信公眾號授權轉載,如需轉載與原文作者聯繫析構函數是C++類針對成員變量刪除時候執行的函數,析構函數與構造函數作用剛好相反,一個在定義變量的時候執行,一直在釋放的時候執行。
  • 223個Python小例子(1-60)
    關鍵詞nonlocal常用於函數嵌套中,聲明變量i為非局部變量;如果不聲明,i+=1表明i為函數wrapper內的局部變量,因為在i+=1引用(reference)時,i未被聲明,所以會報unreferenced variable的錯誤。