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ī)方法定義時(shí)需要傳入self參數(shù),與類的實(shí)例綁定。
也就是說調(diào)用時(shí)需要先實(shí)例化類,然后該實(shí)例才擁有foo()方法,通過A().foo()的方式來調(diào)用。
不能直接用類A.foo()的方式來調(diào)用。
2.類方法class_foo()
用@classmethod修飾的方法需要傳入cls參數(shù)(代表當(dāng)前類),表示該方法與類綁定(不是實(shí)例)
在該函數(shù)內(nèi)部可以調(diào)用屬于類的專有屬性(一般來說定義在__init__外面的屬性如上面的num)。
可以直接用A.class_foo()來調(diào)用,當(dāng)然也可以直接實(shí)例化,通過實(shí)例來調(diào)用。
3.靜態(tài)方法static_foo()
用@staticmethod修飾的方法不需要傳入任何參數(shù)
該方法內(nèi)部不能訪問類或者實(shí)例的屬性,相當(dāng)于定義在類外面的普通方法。
可以直接用A.static_foo()來調(diào)用或者通過實(shí)例來調(diào)用。
二、@classmethod和@staticmethod的異同
相同點(diǎn):
- 都可以直接用類名.方法(A.xx())的方式來訪問,也可以通過實(shí)例來訪問
不同點(diǎn):
- 構(gòu)造時(shí)classmethod需要傳入cls參數(shù),staticmethod不需要
- classmethod可以通過cls.來訪問類的專有屬性,staticmethod不能訪問類的屬性
- classmethod可以被子類繼承,能夠判斷出是父類還是子類調(diào)用
三、使用場(chǎng)景
1.classmethod用在構(gòu)造前交互(即類實(shí)例化之前),一般是用來實(shí)現(xiàn)特殊的構(gòu)造函數(shù)。
e.g我們定義了Date類,需要提供day,month,year三個(gè)參數(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 類實(shí)例。
此時(shí)我們需要將 ('dd-mm-yyyy')轉(zhuǎn)化成三個(gè)整形變量
然后 通過傳遞這些值實(shí)例化 Date。
我們當(dāng)然可以在函數(shù)外面做轉(zhuǎn)化的事,然后去實(shí)例化
如下:
day, month, year = map(date_as_string.split('-')) date1 = Date(day, month, year)
但是很明顯轉(zhuǎn)化這個(gè)功能放在類里面美觀一點(diǎn),但是一般的方法需要類實(shí)例化之后(調(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')這樣的方式就可以生成一個(gè)實(shí)例了。
2.某些不與實(shí)例交互的方法
不與實(shí)例交互就可以完成功能的方法雖然可以通過普通的實(shí)例化方法實(shí)現(xiàn)
但是實(shí)例化之后會(huì)浪費(fèi)更多的時(shí)間與空間。
因此使用staticmethod。
ps:staticmethod方法和一個(gè)定義在lei外面的函數(shù)沒啥區(qū)別,為了美觀和整潔才移到函數(shù)里面的。
到此這篇關(guān)于Python中類方法@classmethod和靜態(tài)方法@staticmethod解析的文章就介紹到這了,更多相關(guān)Python類方法和靜態(tài)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼
本文帶領(lǐng)大家學(xué)習(xí)Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼,代碼實(shí)現(xiàn)思路清晰,簡(jiǎn)單易懂,Python識(shí)別答題卡相關(guān)知識(shí)感興趣的朋友一起看看吧2021-06-06python pandas 組內(nèi)排序、單組排序、標(biāo)號(hào)的實(shí)例
下面小編就為大家分享一篇python pandas 組內(nèi)排序、單組排序、標(biāo)號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Flask實(shí)現(xiàn)跨域請(qǐng)求的處理方法
這篇文章主要介紹了Flask實(shí)現(xiàn)跨域請(qǐng)求的處理方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試
這篇文章主要介紹了python+django+selenium搭建簡(jiǎn)易自動(dòng)化測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python線性網(wǎng)絡(luò)實(shí)現(xiàn)分類糖尿病病例
什么是線性規(guī)劃?想象一下,您有一個(gè)線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對(duì)應(yīng)于某些其他線性函數(shù)的最大值或最小值2022-10-10Python入門教程(十一)Python中的運(yùn)算符
這篇文章主要介紹了Python入門教程(十一)Python中的運(yùn)算符,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04