首頁  >  文章  >  後端開發  >  對於初學者如何理解 @classmethod 和@staticmethod

對於初學者如何理解 @classmethod 和@staticmethod

anonymity
anonymity原創
2019-05-27 11:09:313027瀏覽

staticmethod相當於一個定義在類別裡面的函數,所以如果一個方法既不跟實例相關也不跟特定的類別相關,推薦將其定義為一個staticmethod,這樣不僅使程式碼一目了然,而且似的利於維護代碼。

子類呼叫方法隱形傳入的參數為該物件所對應的類,呼叫過程中動態產生了對應的類別的類變數。

對於初學者如何理解 @classmethod 和@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(&#39;-&#39;))
        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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn