Python中靜態方法,類方法,屬性方法使用方法
1.靜態方法
通過@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
2.類方法
類方法通過@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
3.靜態方法與類方法總結
靜態方法其實就是一個定義在類中的方法,隻是調用時可以不需要先對類進行實例化,直接用類調用即可。無論後面怎麼繼承,它的實現不變。
類方法也在調用時也不需要先對類進行實例化,但是它的實現,在繼承時是跟隨當前的子類的(因為它的第一個參數永遠是cls)
它們常用於將數據預處理等封裝在類內,避免代碼擴散到類外不好維護
4.屬性方法
屬性方法的作用就是通過@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中靜態方法,類方法,屬性方法使用方法的文章就介紹到這瞭,更多相關Python靜態方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python學習之裝飾器與類的裝飾器詳解
- 詳解Python裝飾器之@property
- Python中關於property使用的小技巧
- python中的classmethod與staticmethod
- 詳細介紹python類及類的用法