staticmethod相當於一個定義在類別裡面的函數,所以如果一個方法既不跟實例相關也不跟特定的類別相關,推薦將其定義為一個staticmethod,這樣不僅使程式碼一目了然,而且似的利於維護代碼。
子類呼叫方法隱形傳入的參數為該物件所對應的類,呼叫過程中動態產生了對應的類別的類變數。
理解classicmethod和staticmethod類別是一種資料結構,可以建立物件。當呼叫類別的時候就創建了一個類別的實例物件。一旦物件被創建,python 就會檢查是否實作了init()方法。如果init()已經實現,那麼它將被調用,實例物件作為第一個參數(self)被傳遞進去。
舉個例子,定義一個儲存日期資訊的類別Date,這裡重新定義了初始化函數。
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year def tellDate(self): print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
如果我們需要呼叫tell Date方法,我們就必須先建立一個實例,或是使用Date().tellDate()
date1 = Date() date1.tellDate()
如何直接使用類別名稱呼叫函數呢?
使用@classmethod或@staticmethod都可以類別名稱.方法名()呼叫函數
現在假設我們需要創建很多Date的實例,日期資訊以字串的形式從外部傳入,格式為'dd-mm-yyyy'。需要做的事
將日期資訊字串parse成一個含有年月日三個變數的元組;
實例化一個Date物件時就將年月日作為參數傳入。
就像這樣:
day, month, year = map(int, string_date.split('-')) date1 = Date(day, month, year)
python不能像C 那樣進行重載,所以我們引入class method ,它不需要self參數,但需要第一個參數是表示自身類別的cls參數。
@classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1
使用時可以直接類別名稱.方法名稱()
這樣程式設計的好處有:
分解字串運算可以重複使用,而我們只需要傳入參數一次;
OOP;
cos是類別本身,而不是類別的實例,當我們將Date當作父類別時,其子類別也會擁有from_string方法
#和class method很相似的是staticmethod,但它不需要表示自身物件的self和自身類別的cls參數,就跟使用函數一樣。
@staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999
所有程式及執行結果
class Date(object): day = 0 month = 0 year = 0 def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year def tellDate(self): print 'Today is %s-%s-%s'%(self.day,self.month,self.year) @classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date = cls(day, month, year) return date @staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999 if __name__ == '__main__': date1 = Date() date1.tellDate() date2 = Date.from_string("14-04-2016") date2.tellDate() print Date.is_date_valid("14-04-2016")
運行結果為:
Today is 0-0-0 Today is 14-4-2016 True
以上是對於初學者如何理解 @classmethod 和@staticmethod的詳細內容。更多資訊請關注PHP中文網其他相關文章!