Python中的類方法 靜態方法和例項方法

2021-10-07 10:26:21 字數 3838 閱讀 3504

一、例項方法

先定義乙個輸出日期的類date,後面內容都是基於此類進行拓展。

class

date

:def

__init__

(self,year,month,day)

: self.year=year

self.month=month

self.day=day

def__str__

(self)

:return

"//"

.format

(year=self.year,month=self.month,say=self.day)

if __name__ ==

"__main__"

: new_day = date(

2018,12

,30)print

(new_day)

# 2018/12/30

普通情況下類內定義的都是例項方法,比如上述**中的__init__()__str__()都是例項方法。

比如在一開始的date類中再新定義乙個例項方法tomorrow。該方法使日期數加一(在這為了簡單就不做日期的判斷了)。

def

tomorrow

(self)

: self.day +=

1if __name__ ==

"__main__"

: new_day = date(

2018,12

,30) new_day.tomorrow(

)# python會自動轉換成tomorrow(new_day)這種形式

print

(new_day)

# 2018/12/31

例項方法是針對例項進行操作,像self.變數+賦值符號就變成了例項物件的變數,而修改類變數則要用類名.變數+賦值符號

二、靜態方法

先引入這樣乙個場景,假設date類傳入的字串引數是2018-12-31這個樣子的。而我們一開始定義的傳入引數是用逗號隔開的,所以肯定不行。

那為了達到這樣的目的,先想到的最簡單的辦法就是用split函式,將字串處理一下,再放進去。

date_str =

"2018-12-30"

year, month, day =

tuple

(data_str.split(

"-")

)# print(year,month,day) # 2018 12 30

new_day = date(

int(year)

,int

(month)

,int

(day)

)print

(new_day)

# 2018/12/30

可以想到在date類中並沒有提供可以將字串轉換成標準輸入的方法。所以就有了自己先處理一下再輸入的方法。

這種方法有乙個很大的問題,就是每一次例項化date類時,都需要加上一段處理字串的**(即year, month, day = tuple(data_str.split("-")))。

但實際上我們可以把這種邏輯放到類中,也就是定義靜態方法。

@staticmethod

defparse_from_string

(data_str)

: year, month, day =

tuple

(data_str.split(

"-")

)return date(

int(year)

,int

(month)

,int

(day)

)

python中靜態方法不用接收self

因為在date類的命名空間中,所以要使用date.parse_from_string()進行呼叫

#用staticmethon完成初始化

new_day = date.prase_from_string(date_str)

print

(new_day)

# 2018/12/30

此時**就變得簡潔了,而且還可以在靜態方法中再增加新的邏輯。但靜態方法的的缺點就是因為使用硬編碼的方式,如果類名改為newdate,那麼靜態方法中返回的date也要變為newdate,類多的時候會很麻煩。

所以就有了python中的類方法。

三、類方法

@classmethod

deffrom_string

(cls,data_str):

year, month, day =

tuple

(data_str.split(

"-")

)return cls(

int(year)

,int

(month)

,int

(day)

)

__init__(self)傳遞進來的self是指物件,而from_string()傳遞進來的cls是指類本身。所以此時return的就與類名沒有關係了。

#用classmethon完成初始化

new_day = date.prase_from_string(date_str)

print

(new_day)

# 2018/12/30

那我們是不是覺得classmethod就可以完全替代staticmethod

staticmethod當然還有別的用處,我們再設想乙個場景,判斷字串是否合法。這個用classmethod也是可以的,但是多想一下,做判斷這個邏輯並不用返回這個字串物件,沒有必要用classmethoncls傳遞進來。

@staticmethod

defvalid

(data_str)

: year, month, day =

tuple

(data_str.split(

"-"))if

int(year)

>

0and

(int

(month)

>

0and month<=12)

and(

int(day)

>

0and

int(day)

<=31)

#簡單的邏輯,實際中判斷是否合法不是這樣的

return

true

else:

return

false

print

(date.valid_str(

"2018-12-32"))

# false

小節

靜態方法,類方法前邊需要加乙個裝飾器

python中的類 3 類方法 靜態方法

python中的類方法與靜態方法 面相物件程式設計中,類方法和靜態方法是經常用到的兩個術語。邏輯上講 類方法是只能由類名呼叫 靜態方法可以由類名或物件名進行呼叫。類方法 在python中.類方法 classmethod 是乙個函式修飾符,它表示接下來的是乙個類方法,而對於平常我們見到的則叫做例項方法...

python中的例項方法 類方法 靜態方法

class test object a 1 def init self,a self.a a definstance print self print self.a classmethod defclass fun cls print cls.a staticmethod defstatic fun...

Python中類方法和靜態方法

要在類中使用靜態方法,需在靜態方法前面加上 staticmethod標記符,以表示下面的成員函式是靜態函式。使用靜態方法的好處 其函式不需要self引數,可以通過類呼叫該方法,不需要定義該類例項 當然通過類例項呼叫也沒有問題 類方法可以通過類或它的例項來呼叫,但 該方法的 第乙個引數cls是定義該方...