Python中類方法@classmethod和靜態(tài)方法@staticmethod解析
一、python中的方法
python中存在三種方法,分別為常規(guī)方法(定義中傳入self)、@classmethod修飾的類方法、@staticmethod修飾的靜態(tài)方法。
class A(object):
num = 0
def __init__(self, index = 0):
self.index = index
def foo(self, x):
print("executing foo(%s,%s)" % (self, x))
print('self:', self)
@classmethod
def class_foo(cls, x):
print("executing class_foo(%s,%s)" % (cls, x))
print('cls:', cls.num)
@staticmethod
def static_foo(x):
print("executing static_foo(%s)" % x)
a = A()以上面的代碼為例,其中存在三種類型的方法。
1.常規(guī)方法foo()
常規(guī)方法定義時需要傳入self參數,與類的實例綁定。
也就是說調用時需要先實例化類,然后該實例才擁有foo()方法,通過A().foo()的方式來調用。
不能直接用類A.foo()的方式來調用。
2.類方法class_foo()
用@classmethod修飾的方法需要傳入cls參數(代表當前類),表示該方法與類綁定(不是實例)
在該函數內部可以調用屬于類的專有屬性(一般來說定義在__init__外面的屬性如上面的num)。
可以直接用A.class_foo()來調用,當然也可以直接實例化,通過實例來調用。
3.靜態(tài)方法static_foo()
用@staticmethod修飾的方法不需要傳入任何參數
該方法內部不能訪問類或者實例的屬性,相當于定義在類外面的普通方法。
可以直接用A.static_foo()來調用或者通過實例來調用。
二、@classmethod和@staticmethod的異同
相同點:
- 都可以直接用類名.方法(A.xx())的方式來訪問,也可以通過實例來訪問
不同點:
- 構造時classmethod需要傳入cls參數,staticmethod不需要
- classmethod可以通過cls.來訪問類的專有屬性,staticmethod不能訪問類的屬性
- classmethod可以被子類繼承,能夠判斷出是父類還是子類調用
三、使用場景
1.classmethod用在構造前交互(即類實例化之前),一般是用來實現特殊的構造函數。
e.g我們定義了Date類,需要提供day,month,year三個參數進行初始化。
class Date(object):
day = 0
month = 0
year = 0
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year但是如果我們有很多 ('dd-mm-yyyy') 格式字符串的日期信息,想要把它們創(chuàng)建成 Date 類實例。
此時我們需要將 ('dd-mm-yyyy')轉化成三個整形變量
然后 通過傳遞這些值實例化 Date。
我們當然可以在函數外面做轉化的事,然后去實例化
如下:
day, month, year = map(date_as_string.split('-'))
date1 = Date(day, month, year)但是很明顯轉化這個功能放在類里面美觀一點,但是一般的方法需要類實例化之后(調用了__init__之后)才可以使用,因此這里需要使用@classmethod
class Date(object):
day = 0
month = 0
year = 0
def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year
@classmethod
def from_string(cls, date_as_string):
day, month, year = map(date_as_string.split('-'))
date1 = cls(day, month, year)
return date1
date2 = Date.from_string('11-09-2012')通過date2 = Date.from_string('11-09-2012')這樣的方式就可以生成一個實例了。
2.某些不與實例交互的方法
不與實例交互就可以完成功能的方法雖然可以通過普通的實例化方法實現
但是實例化之后會浪費更多的時間與空間。
因此使用staticmethod。
ps:staticmethod方法和一個定義在lei外面的函數沒啥區(qū)別,為了美觀和整潔才移到函數里面的。
到此這篇關于Python中類方法@classmethod和靜態(tài)方法@staticmethod解析的文章就介紹到這了,更多相關Python類方法和靜態(tài)方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中導入 train_test_split提示錯誤的解決
這篇文章主要介紹了python中導入 train_test_split提示錯誤的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

