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參數(shù),與類的實例綁定。
也就是說調(diào)用時需要先實例化類,然后該實例才擁有foo()方法,通過A().foo()的方式來調(diào)用。
不能直接用類A.foo()的方式來調(diào)用。
2.類方法class_foo()
用@classmethod修飾的方法需要傳入cls參數(shù)(代表當(dāng)前類),表示該方法與類綁定(不是實例)
在該函數(shù)內(nèi)部可以調(diào)用屬于類的專有屬性(一般來說定義在__init__外面的屬性如上面的num)。
可以直接用A.class_foo()來調(diào)用,當(dāng)然也可以直接實例化,通過實例來調(diào)用。
3.靜態(tài)方法static_foo()
用@staticmethod修飾的方法不需要傳入任何參數(shù)
該方法內(nèi)部不能訪問類或者實例的屬性,相當(dāng)于定義在類外面的普通方法。
可以直接用A.static_foo()來調(diào)用或者通過實例來調(diào)用。
二、@classmethod和@staticmethod的異同
相同點:
- 都可以直接用類名.方法(A.xx())的方式來訪問,也可以通過實例來訪問
不同點:
- 構(gòu)造時classmethod需要傳入cls參數(shù),staticmethod不需要
- classmethod可以通過cls.來訪問類的專有屬性,staticmethod不能訪問類的屬性
- classmethod可以被子類繼承,能夠判斷出是父類還是子類調(diào)用
三、使用場景
1.classmethod用在構(gòu)造前交互(即類實例化之前),一般是用來實現(xiàn)特殊的構(gòu)造函數(shù)。
e.g我們定義了Date類,需要提供day,month,year三個參數(shù)進(jìn)行初始化。
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')轉(zhuǎn)化成三個整形變量
然后 通過傳遞這些值實例化 Date。
我們當(dāng)然可以在函數(shù)外面做轉(zhuǎn)化的事,然后去實例化
如下:
day, month, year = map(date_as_string.split('-'))
date1 = Date(day, month, year)但是很明顯轉(zhuǎn)化這個功能放在類里面美觀一點,但是一般的方法需要類實例化之后(調(diào)用了__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.某些不與實例交互的方法
不與實例交互就可以完成功能的方法雖然可以通過普通的實例化方法實現(xiàn)
但是實例化之后會浪費更多的時間與空間。
因此使用staticmethod。
ps:staticmethod方法和一個定義在lei外面的函數(shù)沒啥區(qū)別,為了美觀和整潔才移到函數(shù)里面的。
到此這篇關(guān)于Python中類方法@classmethod和靜態(tài)方法@staticmethod解析的文章就介紹到這了,更多相關(guān)Python類方法和靜態(tài)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中導(dǎo)入 train_test_split提示錯誤的解決
這篇文章主要介紹了python中導(dǎo)入 train_test_split提示錯誤的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
使用python切片實現(xiàn)二維數(shù)組復(fù)制示例
今天小編就為大家分享一篇使用python切片實現(xiàn)二維數(shù)組復(fù)制示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Python中如何將Tqdm與Asyncio結(jié)合使用呢
這篇文章主要和大家詳細(xì)介紹了在Python中如何將Tqdm與Asyncio結(jié)合使用呢,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05

