中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中靜態方法,類方法,屬性方法怎么使用

發布時間:2022-05-20 09:05:16 來源:億速云 閱讀:142 作者:iii 欄目:開發技術

本篇內容介紹了“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中靜態方法,類方法,屬性方法怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

城口县| 年辖:市辖区| 浮梁县| 嘉荫县| 临澧县| 长垣县| 华亭县| 会东县| 唐河县| 房产| 丰都县| 浑源县| 信宜市| 诸暨市| 蒙山县| 三原县| 铁岭市| 吉安市| 汶川县| 朝阳区| 海阳市| 怀化市| 乐山市| 子长县| 同仁县| 海晏县| 两当县| 陕西省| 阳东县| 武陟县| 双江| 泸定县| 石狮市| 卓资县| 交口县| 太原市| 思南县| 杭州市| 柯坪县| 常熟市| 林芝县|