一、例項方法
先定義乙個輸出日期的類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
也是可以的,但是多想一下,做判斷這個邏輯並不用返回這個字串物件,沒有必要用classmethon
把cls
傳遞進來。
@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是定義該方...