您好,登錄后才能下訂單哦!
本篇內容介紹了“Python中靜態方法,類方法,屬性方法怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什么是靜態方法呢?其實不難理解,普通的方法,可以在實例化后直接調用,并且在方法里可以通過self.調用實例變量或類變量,但靜態方法是不可以訪問實例變量或類變量的,一個不能訪問實例變量和類變量的方法,其實相當于跟類本身已經沒什么關系了,它與類唯一的關聯就是需要通過類名來調用這個方法
應用:
對與一個類,我們要調用它的一個方法,必須要綁定實例,而不能直接通過類名.方法名()的形式調用。因此,想要通過類來調用方法,而不是通過實例,可以使用靜態方法@staticmethod和類方法@classmethod的形式實現。
#靜態方法 只是名義上歸類管理,實際上在靜態方法里訪問不了類或實例中 的任何屬性 class Dog(object): def __init__(self,name): self.name=name @staticmethod #實際上跟類本身已沒什么關系,只是名義上是類的方法(與類無關,不能訪問類里的任何屬性和方法) def eat(self,name): print("%s is eating %s"%(self.name,name)) d=Dog('sb') # d.eat('baozi')#出錯 原因是eat需要一個self參數,但調用時卻沒有傳遞,沒錯,因為當eat變成靜態方法后,再通過實例調用時就不會自動把實例本身當作一個參數傳給self了 #解決辦法 #1.調用時主動傳遞實例本身給eat方法#在eat中去掉self參數,但這也意味著,在eat中不能通過self.調用實例中的其他變量了 d.eat(d,'baozi') #執行結果 >>>sb is eating baozi
類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變量,不能訪問實例變量
class Dog(object): name='SB' #類變量 def __init__(self,name): self.name=name @classmethod #類方法只能訪問類變量,不能訪問實例變量 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') #執行結果 SB is eating Mantou
靜態方法其實就是一個定義在類中的方法,只是調用時可以不需要先對類進行實例化,直接用類調用即可。無論后面怎么繼承,它的實現不變。
類方法也在調用時也不需要先對類進行實例化,但是它的實現,在繼承時是跟隨當前的子類的(因為它的第一個參數永遠是cls)
它們常用于將數據預處理等封裝在類內,避免代碼擴散到類外不好維護
屬性方法的作用就是通過@property把一個方法變成一個靜態屬性
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Dog(object): name='suantou' def __init__(self,name): self.name=name @property #把一個方法變成一個靜態屬性 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, 因為eat此時已經變成一個靜態屬性了, 不是方法了, 想調用已經不需要加()號了,直接d.eat就可以了 d.eat d.eat='baozi'
實際場景應用:
比如 ,你想知道一個航班當前的狀態,是到達了、延遲了、取消了、還是已經飛走了, 想知道這種狀態你必須經歷以下幾步:
連接航空公司API查詢
對查詢結果進行解析
返回結果給你的用戶
因此這個status屬性的值是一系列動作后才得到的結果,所以你每次調用時,其實它都要經過一系列的動作才返回你結果,但這些動作過程不需要用戶關心, 用戶只需要調用這個屬性就可以了
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 # 觸發@flight_status.setter del f.flight_status # 觸發@flight_status.deleter
“Python中靜態方法,類方法,屬性方法怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。