您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python中靜態(tài)方法,類方法,屬性方法怎么使用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
通過@staticmethod裝飾器即可把其裝飾的方法變?yōu)橐粋€靜態(tài)方法,什么是靜態(tài)方法呢?其實(shí)不難理解,普通的方法,可以在實(shí)例化后直接調(diào)用,并且在方法里可以通過self.調(diào)用實(shí)例變量或類變量,但靜態(tài)方法是不可以訪問實(shí)例變量或類變量的,一個不能訪問實(shí)例變量和類變量的方法,其實(shí)相當(dāng)于跟類本身已經(jīng)沒什么關(guān)系了,它與類唯一的關(guān)聯(lián)就是需要通過類名來調(diào)用這個方法
應(yīng)用:
對與一個類,我們要調(diào)用它的一個方法,必須要綁定實(shí)例,而不能直接通過類名.方法名()的形式調(diào)用。因此,想要通過類來調(diào)用方法,而不是通過實(shí)例,可以使用靜態(tài)方法@staticmethod和類方法@classmethod的形式實(shí)現(xiàn)。
#靜態(tài)方法 只是名義上歸類管理,實(shí)際上在靜態(tài)方法里訪問不了類或?qū)嵗?nbsp;的任何屬性 class Dog(object): def __init__(self,name): self.name=name @staticmethod #實(shí)際上跟類本身已沒什么關(guān)系,只是名義上是類的方法(與類無關(guān),不能訪問類里的任何屬性和方法) def eat(self,name): print("%s is eating %s"%(self.name,name)) d=Dog('sb') # d.eat('baozi')#出錯 原因是eat需要一個self參數(shù),但調(diào)用時卻沒有傳遞,沒錯,因?yàn)楫?dāng)eat變成靜態(tài)方法后,再通過實(shí)例調(diào)用時就不會自動把實(shí)例本身當(dāng)作一個參數(shù)傳給self了 #解決辦法 #1.調(diào)用時主動傳遞實(shí)例本身給eat方法#在eat中去掉self參數(shù),但這也意味著,在eat中不能通過self.調(diào)用實(shí)例中的其他變量了 d.eat(d,'baozi') #執(zhí)行結(jié)果 >>>sb is eating baozi
類方法通過@classmethod裝飾器實(shí)現(xiàn),類方法和普通方法的區(qū)別是, 類方法只能訪問類變量,不能訪問實(shí)例變量
class Dog(object): name='SB' #類變量 def __init__(self,name): self.name=name @classmethod #類方法只能訪問類變量,不能訪問實(shí)例變量 def eat(self,name): print('%s is eating %s'%(self.name,name)) def talk(self,something): print("%s is talking %s"%(self.name,something)) d=Dog('Lulu') d.eat('Mantou') #執(zhí)行結(jié)果 SB is eating Mantou
靜態(tài)方法其實(shí)就是一個定義在類中的方法,只是調(diào)用時可以不需要先對類進(jìn)行實(shí)例化,直接用類調(diào)用即可。無論后面怎么繼承,它的實(shí)現(xiàn)不變。
類方法也在調(diào)用時也不需要先對類進(jìn)行實(shí)例化,但是它的實(shí)現(xiàn),在繼承時是跟隨當(dāng)前的子類的(因?yàn)樗牡谝粋€參數(shù)永遠(yuǎn)是cls)
它們常用于將數(shù)據(jù)預(yù)處理等封裝在類內(nèi),避免代碼擴(kuò)散到類外不好維護(hù)
屬性方法的作用就是通過@property把一個方法變成一個靜態(tài)屬性
''' 學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' class Dog(object): name='suantou' def __init__(self,name): self.name=name @property #把一個方法變成一個靜態(tài)屬性 def eat(self): print('%s is eating %s'%(self.name,'something')) @eat.setter #為eat屬性賦值 def eat(self,food): print('set to food',food) def talk(self,something): print("%s is talking %s"%(self.name,something)) d=Dog('Lulu') #d.eat('baozi')出錯 說NoneType is not callable, 因?yàn)閑at此時已經(jīng)變成一個靜態(tài)屬性了, 不是方法了, 想調(diào)用已經(jīng)不需要加()號了,直接d.eat就可以了 d.eat d.eat='baozi'
實(shí)際場景應(yīng)用:
比如 ,你想知道一個航班當(dāng)前的狀態(tài),是到達(dá)了、延遲了、取消了、還是已經(jīng)飛走了, 想知道這種狀態(tài)你必須經(jīng)歷以下幾步:
連接航空公司API查詢
對查詢結(jié)果進(jìn)行解析
返回結(jié)果給你的用戶
因此這個status屬性的值是一系列動作后才得到的結(jié)果,所以你每次調(diào)用時,其實(shí)它都要經(jīng)過一系列的動作才返回你結(jié)果,但這些動作過程不需要用戶關(guān)心, 用戶只需要調(diào)用這個屬性就可以了
class Flight(object): def __init__(self, name): self.flight_name = name def checking_status(self): print("checking flight %s status " % self.flight_name) return 1 @property def flight_status(self): status = self.checking_status() if status == 0: print("flight got canceled...") elif status == 1: print("flight is arrived...") elif status == 2: print("flight has departured already...") else: print("cannot confirm the flight status...,please check later") @flight_status.setter # 修改 def flight_status(self, status): status_dic = { 0: "canceled", 1:"arrived", 2: "departured" } print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status)) @flight_status.deleter # 刪除 def flight_status(self): print("status got removed...") f = Flight("CA980") f.flight_status f.flight_status = 2 # 觸發(fā)@flight_status.setter del f.flight_status # 觸發(fā)@flight_status.deleter
“Python中靜態(tài)方法,類方法,屬性方法怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。