python 類方法 靜態方法和例項方法

2021-10-24 10:53:31 字數 1954 閱讀 4609

(寫的時候感覺怪怪的,後面發現是類名首字母沒有大寫,不改了,請見諒)

對python中的類來說,可以有類方法,靜態方法,例項方法三種方法。

這三種方法裡面,例項方法應該是大家最熟悉的一種方法。其標誌就是方法的第乙個引數為self,通過類的例項來呼叫,呼叫時會預設將例項物件作為self引數傳入。當然也可以通過類呼叫例項方法,手動傳例項進去。見下圖。

我們可以看到兩種方式呼叫結果是一樣的。實際上第二種呼叫方式,我們不傳c例項進去,比如calculator.times(a,2,3)也能得到6,當然如果times中對例項進行操作的話就會報錯了。

python中使用@classmethod裝飾器來裝飾類方法。所以,類方法的特徵有兩個:一是 @classmethod 裝飾器;二是方法的第乙個引數為cls ,代表所屬的類,類方法可以通過cls來操作類的屬性和方法。

這裡提一嘴,@classmethod裝飾器中的classmethod並不是函式,而是乙個類。我們知道類其實也是可呼叫物件(可參見我關於可呼叫物件的文章),classmethod(func) = classmethod.__ init __(func),對吧。classmethod的原始碼是c編的,我們看不到,就不深究下去了,就知道裝飾以後是類方法就可以了。

類的方法可以通過類或者例項來呼叫,並可以通過cls引數訪問類的屬性和方法。如下圖所示。我們通過calculator類和c例項都可以呼叫minus類方法,並且可以訪問類的屬性name。

需要注意的是,類不能訪問例項的方法(是指calculator.times(a,b)這種,上面通過手動傳例項不算),這是因為例項繼承了類的屬性和方法,而類不可能例項初始化出來的屬性等等。

python中對靜態方法也有乙個裝飾器@staticmethod來進行標識。靜態方法也是通過類或者例項來呼叫的,但是不能直接呼叫,這有點我們呼叫模組中方法的感覺。import module1;module1.func();對吧,靜態方法『屬於』類,我們通過類找到靜態方法,當然類的例項繼承了相關的資訊,也可以呼叫靜態方法。如下圖。結果我不貼上來了,都是一樣的。

另外我們想靜態方法能不能『直接』呼叫類的靜態屬性呢?試一下。

發現報錯了。那我們加nonlocal 或者global 試一下呢?

結果我不貼了,也都報錯了。

後面我還做了一些驗證,例如使用global的時候,在類的外面定義name = 『123』,這時沒有報錯,print的是『123』。有興趣可以自己試一下。

所以這個地方,類中的靜態屬性的變數名應該是類似calculator.name這樣,即使是類內部也無法通過name直接訪問。

這三種方法,子類都可以從父類繼承,很好驗證,同樣圖不貼了。

以上。

python 靜態方法和類方法

python 靜態方法和類方法 class testclassmethod object method method hoho def init self self.name leon def test1 self print test1 print self classmethod def tes...

python 類的靜態方法和類方法

1.靜態方法 使用 staticmethod修飾 不需要傳入引數,類和類的例項物件都可以呼叫 沒有引數的方法,如果未宣告靜態方法的話,例項物件呼叫將會出錯 1class a staticmethod 宣告靜態方法 def printa 無需引數 print a a.printa 類名直接呼叫 a a...

Python例項方法 靜態方法和類方法

和類屬性可細分為類屬性和例項屬性一樣,類中的方法也可以有更細緻的劃分,具體可分為類方法 例項方法和靜態方法,本節將詳細介紹這 3 種類方法的特點和用法。通常情況下,在類中定義的方法預設都是例項方法。前面章節中,我們已經定義了不只乙個例項方法。不僅如此,類的構造方法理論上也屬於例項方法,只不過它比較特...