Python中靜態(tài)方法,類方法,屬性方法使用方法
1.靜態(tài)方法
通過@staticmethod裝飾器即可把其裝飾的方法變?yōu)橐粋€靜態(tài)方法,什么是靜態(tài)方法呢?其實不難理解,普通的方法,可以在實例化后直接調(diào)用,并且在方法里可以通過self.調(diào)用實例變量或類變量,但靜態(tài)方法是不可以訪問實例變量或類變量的,一個不能訪問實例變量和類變量的方法,其實相當于跟類本身已經(jīng)沒什么關系了,它與類唯一的關聯(lián)就是需要通過類名來調(diào)用這個方法
應用:
對與一個類,我們要調(diào)用它的一個方法,必須要綁定實例,而不能直接通過類名.方法名()的形式調(diào)用。因此,想要通過類來調(diào)用方法,而不是通過實例,可以使用靜態(tài)方法@staticmethod和類方法@classmethod的形式實現(xiàn)。
#靜態(tài)方法 只是名義上歸類管理,實際上在靜態(tài)方法里訪問不了類或?qū)嵗?的任何屬性
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參數(shù),但調(diào)用時卻沒有傳遞,沒錯,因為當eat變成靜態(tài)方法后,再通過實例調(diào)用時就不會自動把實例本身當作一個參數(shù)傳給self了
#解決辦法
#1.調(diào)用時主動傳遞實例本身給eat方法#在eat中去掉self參數(shù),但這也意味著,在eat中不能通過self.調(diào)用實例中的其他變量了
d.eat(d,'baozi')
#執(zhí)行結果
>>>sb is eating baozi2.類方法
類方法通過@classmethod裝飾器實現(xiàn),類方法和普通方法的區(qū)別是, 類方法只能訪問類變量,不能訪問實例變量
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')
#執(zhí)行結果
SB is eating Mantou3.靜態(tài)方法與類方法總結
靜態(tài)方法其實就是一個定義在類中的方法,只是調(diào)用時可以不需要先對類進行實例化,直接用類調(diào)用即可。無論后面怎么繼承,它的實現(xiàn)不變。
類方法也在調(diào)用時也不需要先對類進行實例化,但是它的實現(xiàn),在繼承時是跟隨當前的子類的(因為它的第一個參數(shù)永遠是cls)
它們常用于將數(shù)據(jù)預處理等封裝在類內(nèi),避免代碼擴散到類外不好維護
4.屬性方法
屬性方法的作用就是通過@property把一個方法變成一個靜態(tài)屬性
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, 因為eat此時已經(jīng)變成一個靜態(tài)屬性了, 不是方法了, 想調(diào)用已經(jīng)不需要加()號了,直接d.eat就可以了
d.eat
d.eat='baozi'實際場景應用:
比如 ,你想知道一個航班當前的狀態(tài),是到達了、延遲了、取消了、還是已經(jīng)飛走了, 想知道這種狀態(tài)你必須經(jīng)歷以下幾步:
- 連接航空公司API查詢
- 對查詢結果進行解析
- 返回結果給你的用戶
因此這個status屬性的值是一系列動作后才得到的結果,所以你每次調(diào)用時,其實它都要經(jīng)過一系列的動作才返回你結果,但這些動作過程不需要用戶關心, 用戶只需要調(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)方法,類方法,屬性方法使用方法的文章就介紹到這了,更多相關Python靜態(tài)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)對圖像加噪(高斯噪聲 椒鹽噪聲)
這篇文章主要介紹了展示通過Python給圖像疊加不同等級的椒鹽噪聲和高斯噪聲的代碼,相應的疊加噪聲的已編為對應的類,可實例化使用。感興趣的同學可以看看2021-11-11
python實現(xiàn)坦克大戰(zhàn)游戲 附詳細注釋
這篇文章主要為大家詳細介紹了python實現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
使用python查找windows系統(tǒng)中所有程序的安裝信息
這篇文章主要為大家介紹了使用python查找windows系統(tǒng)中所有程序的安裝信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
python創(chuàng)建屬于自己的單詞詞庫 便于背單詞
這篇文章主要為大家詳細介紹了python創(chuàng)建屬于自己的單詞詞庫,便于背單詞,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
AI生成圖片Stable?Diffusion環(huán)境搭建與運行方法
Stable?Diffusion是一種基于擴散過程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機變量的穩(wěn)定分布,通過遞歸地應用擴散過程來生成高質(zhì)量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運行,需要的朋友可以參考下2023-05-05
Python Numpy教程之排序,搜索和計數(shù)詳解
這篇文章主要為大家詳細介紹了Python?NumPy中排序,搜索和計數(shù)的實現(xiàn),文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下2022-08-08

