Python學習筆記——動態新增屬性與方法
我們都知道Python是動態語言。
動態?動態在哪裡呢?
假如C語言定義了一個類,我們在類固定的情況下,可以不可以為這個類或者這個類的物件新增物件呢?答案肯定是否定的
但是Python就可以。下面我們來看看。
一.動態新增屬性
1.動態新增物件屬性
我們來新建一個類。
我們建立了一個Person類,用Person類生成了一個物件
xiaoming有2個屬性,一個屬性是姓名,一個屬性是年齡
這兩個屬性直接呼叫是沒有問題的
動態在於 我們直接 xiaoming.addr = ‘北京市XXX’
然後我們呼叫xiaoming.addr 就有這個屬性了,我們剛才沒有動類的結構吧?這就是動態新增,在程式執行的時候我們就可以對 這個類生成的物件
xiaoguang是Person類生成的物件,然而小光並沒有addr這個屬性。
物件.新屬性,生成的屬性,是繫結在該物件身上的,在同類物件身上是無法使用的。
2.動態新增類屬性
之前我們說過,有一種屬性叫做類屬性,此類生成的物件,自動繼承非私有類屬性。例如:
這是在構造類的時候,直接在類中寫一個addr屬性,我們可以利用屬性呼叫這個屬性,也可以像這樣呼叫Person.addr。
我們用同樣的方式為類動態新增屬性試試~
這時候我有個疑問,按照一般邏輯,我們先為類新增屬性,然後再用這個類生成物件,那麼這個類的屬性肯定就被物件繼承了
那如果我先新建物件,然後在動態新增類屬性呢?
先建立物件後動態新增類屬性,物件竟然也自動繼承了類屬性。我一臉懵逼,這就是動態所在吧。
今天先到這裡,後面還有動態新增方法。改天再寫。
二.動態新增方法
1.動態新增例項方法
既然動態新增屬性會了,那我們先試著用同樣的方法新增方法。
看看清楚,run是類自己有的方法,我呼叫的時候只需要xxx.run()就可以了。
但是eat是我們動態新增的方法,需要傳個引數,這個引數其實就是物件本身
(在類內的self本質上就是物件本身)
這樣也是可以呼叫的,但是這不是我們想要的樣子啊,我們想做到和run方法一樣,直接呼叫就行
那我們應該怎麼辦呢?
這時候我們就要引入一個東西了。叫做types這個模組中有個方法叫做MethodTpye是專門用於動態新增方法的。
就這麼簡單,我們完成了動態新增方法。
那有人會問,為什麼要用xiaoming.eat去接這個MethodTypes的返回值呢?
用別的接可不可以?
你別說用別的接了,就是不接直接在後面加()都可以出結果
我們來help一下看看
引數(方法名,物件名)
創造一個繫結例項物件的方法物件
這裡可以明白之前的用法了吧。
MethodType幫助我們把被繫結的物件固化在了方法裡,然後把這個方法的地址傳了回來
我們用xiaoming.eat接收是為了更明白的表達小明擁有了eat方法,就像類結構中本來就有的run方法一樣。
2.動態新增類方法
我們都知道類方法是被所有由此類生成的物件繼承的。
我們利用剛才的原理也不難為類動態新增類方法。
3.總結
明白MethodType方法以及其返回值就好了。一定記得它返回的是地址,你要用物件.新建方法名,或者類.新建類方法名 去接返回值。還有就是記得匯入types(我就總犯這個錯誤,滑稽臉)