1. 程式人生 > >Python學習筆記——動態新增屬性與方法

Python學習筆記——動態新增屬性與方法

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

動態?動態在哪裡呢?

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

但是Python就可以。下面我們來看看。

一.動態新增屬性

1.動態新增物件屬性

我們來新建一個類。

這裡寫圖片描述

我們建立了一個Person類,用Person類生成了一個物件

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

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

動態在於 我們直接 xiaoming.addr = ‘北京市XXX’

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

進行擴充,當然這樣繫結完後,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(我就總犯這個錯誤,滑稽臉)