程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python之 @staticmethod 和 @classmethod

編輯:Python

作者 : 不良使
潛力創作新星 華為雲享專家
博客記錄學習的思路,項目和錯誤,尋找志同道合的朋友
如果覺得有幫助記得一鍵三連 ┗|`O′|┛ 嗷~~


引言

這篇文章是我對python裡面的靜態方法(staticmethod) 和 類方法(classmethod)的一些見解,希望能夠幫助到大家。在准備寫這篇文章之前我也是很迷茫,總是不理解,得過且過,能看懂代碼就行,反正又不常用,就沒放在心上。但是最近由於項目需要,滿屏的靜態方法和類方法屬實讓我有點迷茫,怎麼辦,想要繼續下去,那就只有學了。不逼自己一把,永遠不知道自己的潛力有多大。

一個比較簡單粗暴的區分方式:要決定是使用@staticmethod還是@classmethod,你必須看看類方法內部。如果你的方法訪問了類中的其他變量/方法,那麼就使用@classmethod。另一方面,如果方法沒有接觸到類中的任何其他變量,那麼就使用@staticmethod。
但是其設計有更深的邏輯聯系:
classmethod主要用於替代構造函數。
staticmethod不使用對象的狀態,甚至不使用類本身的結構。它可以是一個類外部的函數。它只放在類的內部,用於分組具有類似功能的函數(例如,像Java的數學類靜態方法)

@classmethod
Person.printAge = classmethod(Person.printAge)

@staticmethod
Calculator.add_numbers = staticmethod(Calculator.add_numbers)

能看懂這兩行代碼,應該就能理解什麼是靜態方法,什麼是類方法了吧。當然,看的不太懂也沒有關系,下面通過栗子來詳細的解說一下\

@classmethod

什麼是類方法?

什麼是類方法?
類方法是綁定到類而不是其對象的方法。它不需要創建類實例,就像staticmethod 一樣。

靜態方法和類方法之間的區別在於:

靜態方法對類一無所知,只處理參數
類方法適用於類,因為它的參數始終是類本身。
類方法可以由類及其對象調用。

Class.classmethod()
Class().classmethod()

但無論如何,class方法始終附加到一個類,其中第一個參數作為類本身。cls

def classMethod(cls, args…)


例子1

代碼:


class Person:
age = 25
def printAge(cls):
print('The age is:', cls.age)
Person.printAge = classmethod(Person.printAge)
Person.printAge()

結果:


代碼:

class Person:
age = 25
@classmethod
def printAge(cls):
print('The age is:', cls.age)
Person.printAge()

結果:

你會發現改變了代碼,但是結果還是一樣的。你細心就會有所發現,沒錯,代碼中的
****@classmethod等價於Person.printAge = classmethod(Person.printAge)

實例方法可以調用實例方法、類方法、靜態方法。類對象只能調用類方法、靜態方法。

classmethod與staticmethod用法類似,classmethod可以通過staticmethod代替,在通過類調用時,這兩者對於調用者來說是不可區分的。這兩者的區別在於,classmethod增加了一個對實際調用類的引用。
🥭🥭方法可以判斷出自己是通過基類被調用,還是通過某個子類被調用
🥭🥭通過子類調用時,方法可以返回子類的實例而非基類的實例
🥭🥭通過子類調用時,方法可以調用子類的其他classmethod







覺得有用的可以給個三連,關注一波!!!帶你了解更多的python小知識


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved