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!

推薦閱讀: