Python的動態新增屬性與方法

2021-09-24 22:39:33 字數 2469 閱讀 5612

我們都知道python是動態語言。

動態?動態在**呢?

假如c語言定義了乙個類,我們在類固定的情況下,可以不可以為這個類或者這個類的物件新增物件呢?答案肯定是否定的

python就可以。下面我們來看看。

一.動態新增屬性

1.動態新增物件屬性

我們來新建乙個類。

我們建立了乙個person類,用person類生成了乙個物件

xiaoming有2個屬性,乙個屬性是姓名,乙個屬性是年齡

這兩個屬性直接呼叫是沒有問題的

動態在於 我們直接 xiaoming.addr = 『北京市***』

然後我們呼叫xiaoming.addr 就有這個屬性了,我們剛才沒有動類的結構吧?這就是動態新增,在程式執行的時候我們就可以對 這個類生成的物件 進行擴充,當然這樣繫結完後,addr屬性是屬於小明的。

xiaoguang是person類生成的物件,然而小光並沒有addr這個屬性。

物件.新屬性,生成的屬性,是繫結在該物件身上的,在同類物件身上是無法使用的。

2.動態新增類屬性

之前我們說過,有一種屬性叫做類屬性,此類生成的物件,自動繼承非私有類屬性。例如:

這是在構造類的時候,直接在類中寫乙個addr屬性,我們可以利用屬性呼叫這個屬性,也可以像這樣呼叫person.addr。

我們用同樣的方式為類動態新增屬性試試~

這時候我有個疑問,按照一般邏輯,我們先為類新增屬性,然後再用這個類生成物件,那麼這個類的屬性肯定就被物件繼承了

那如果我先新建物件,然後在動態新增類屬性呢?

先建立物件後動態新增類屬性,物件竟然也自動繼承了類屬性。我一臉懵逼,這就是動態所在吧。

今天先到這裡,後面還有動態新增方法。改天再寫。

二.動態新增方法

1.動態新增例項方法

既然動態新增屬性會了,那我們先試著用同樣的方法新增方法。

看看清楚,run是類自己有的方法,我呼叫的時候只需要***.run()就可以了。

但是eat是我們動態新增的方法,需要傳個引數,這個引數其實就是物件本身

(在類內的self本質上就是物件本身)

這樣也是可以呼叫的,但是這不是我們想要的樣子啊,我們想做到和run方法一樣,直接呼叫就行

那我們應該怎麼辦呢?

這時候我們就要引入乙個東西了。叫做types這個模組中有個方法叫做methodtpye是專門用於動態新增方法的。

就這麼簡單,我們完成了動態新增方法。

那有人會問,為什麼要用xiaoming.eat去接這個methodtypes的返回值呢?

用別的接可不可以?

你別說用別的接了,就是不接直接在後面加()都可以出結果

我們來help一下看看

引數(方法名,物件名)

創造乙個繫結例項物件的方法物件

這裡可以明白之前的用法了吧。

methodtype幫助我們把被繫結的物件固化在了方法裡,然後把這個方法的位址傳了回來

我們用xiaoming.eat接收是為了更明白的表達小明擁有了eat方法,就像類結構中本來就有的run方法一樣。

2.動態新增類方法

我們都知道類方法是被所有由此類生成的物件繼承的。

我們利用剛才的原理也不難為類動態新增類方法。

3.總結

明白methodtype方法以及其返回值就好了。一定記得它返回的是位址,你要用物件.新建方法名,或者類.新建類方法名 去接返回值。還有就是記得匯入types(我就總犯這個錯誤,滑稽臉)

Python動態新增屬性

class student object classmethod修飾的屬性可以通過類變數和類例項變數直接呼叫 因為在這兩種情況下都可以將類變數繫結到 classmethod修飾的方法的第乙個引數上 classmethod def eat cls print eating.當類的例項動態新增屬性時 c...

Python 動態屬性方法的新增和限制新增屬性

在沒有定義乙個屬性的時候,我們可以動態的定義乙個屬性或者方法。from types import methodtype class person pass if name main p person p.name laobi print p.name f 學習 python venv scripts...

python動態新增類屬性 Python動態類屬性

python動態新增類屬性教程 python動態新增類屬性詳解 語法class student pass student.attr value 說明我們可以直接使用 類名.屬性 值 的形式,給類動態地新增乙個類屬性。案例動態新增類屬性 給 python 中的類動態新增屬性 print 嗨客網 www...