@classmethod和@staticmethod裝飾器

@classsmethod 類裝飾器:當(dāng)用此裝飾器定義方法時(shí),將類而不是類的實(shí)例作為第一個(gè)參數(shù),這意味著可以在此方法中直接使用類的屬性,而不是特定的實(shí)例的屬性,因此不必進(jìn)行硬編碼。

@staticmethod 靜態(tài)裝飾器:當(dāng)用此裝飾器定義方法時(shí),不會(huì)傳遞類或?qū)嵗鳛樗膮?shù),這意味著可以在類中放置一個(gè)函數(shù)。靜態(tài)方法就是普通的函數(shù),只是碰巧在類的定義體中,而不是在模塊層定義。

在《流暢的Python》中,作者對(duì)這兩個(gè)裝飾器的評(píng)價(jià):classmethod 裝飾器非常有用,但是我從未見過不得不用 staticmethod 的情況。如果想定義不需要與類交互的函數(shù),那么在模塊中定義就好了。有時(shí),函數(shù)雖然從不處理類,但是函數(shù)的功能與類緊密相關(guān),因此想把它放在近處。即便如此,在同一模塊中的類前面或后面定義函數(shù)也就行了。

class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

    @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

date2 = Date.from_string('11-09-2012')
is_date = Date.is_date_valid('11-09-2012')

使用靜態(tài)方法寫基類,注意靜態(tài)方法使用了實(shí)例的硬編碼。

class Date:
  def __init__(self, month, day, year):
    self.month = month
    self.day   = day
    self.year  = year

  def display(self):
    return "{0}-{1}-{2}".format(self.month, self.day, self.year)

  @staticmethod
  def millenium(month, day):
    return Date(month, day, 2000)

new_year = Date(1, 1, 2013)               # Creates a new Date object
millenium_new_year = Date.millenium(1, 1) # also creates a Date object. 

# Proof:
new_year.display()           # "1-1-2013"
millenium_new_year.display() # "1-1-2000"

isinstance(new_year, Date) # True
isinstance(millenium_new_year, Date) # True

繼承之后,millenium方法就用不了了。

class DateTime(Date):
  def display(self):
      return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year)

datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)

isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # False

datetime1.display() # returns "10-10-1990 - 00:00:00PM"
datetime2.display() # returns "10-10-2000" because it's not a DateTime object but a Date object.

改成類方法,

@classmethod
def millenium(cls, month, day):
    return cls(month, day, 2000)

就正確了

datetime1 = DateTime(10, 10, 1990)
datetime2 = DateTime.millenium(10, 10)

isinstance(datetime1, DateTime) # True
isinstance(datetime2, DateTime) # True

datetime1.display() # "10-10-1990 - 00:00:00PM"
datetime2.display() # "10-10-2000 - 00:00:00PM"

代碼來自下面的鏈接,答的很贊:
https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • @classsmethod 類裝飾器:當(dāng)用此裝飾器定義方法時(shí),我們將類而不是類的實(shí)例作為第一個(gè)參數(shù),這意味著我們可...
    Manchangdx閱讀 987評(píng)論 0 0
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個(gè)常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,922評(píng)論 0 27
  • 1.下列四組數(shù),依次為二進(jìn)制、八進(jìn)制和十六進(jìn)制,符合要求的是()a. 12, 77, 10b. 12, 80...
    zxhlcl閱讀 243評(píng)論 0 0
  • 這是一篇自我介紹。 “哈嘍,大家好!我是阿星,來著霧都隔壁的芙蓉城,成都,我喜歡跑步,請(qǐng)多指教!” 這畫風(fēng)像不像近...
    阿星oo閱讀 348評(píng)論 0 3

友情鏈接更多精彩內(nèi)容