我們都知道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...