當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python classmethod()用法及代碼示例


在本教程中,我們將借助示例了解 Python classmethod() 函數。

classmethod() 方法返回給定函數的類方法。

示例

class Student:
  marks = 0

  def compute_marks(self, obtained_marks):
    marks = obtained_marks
    print('Obtained Marks:', marks)

# convert compute_marks() to class method
Student.print_marks = classmethod(Student.compute_marks)
Student.print_marks(88)

# Output: Obtained Marks: 88

classmethod() 語法

用法:

classmethod(function)

classmethod() 被認為是 un-Pythonic 因此在較新的 Python 版本中,您可以使用 @classmethod 裝飾器來定義類方法。

語法是:

@classmethod
def func(cls, args...)

參數:

classmethod() 方法采用單個參數:

  • function- 需要轉換成類方法的函數

返回:

classmethod() 方法返回給定函數的類方法。

什麽是類方法?

類方法是綁定到類而不是其對象的方法。它不需要創建類實例,就像 staticmethod 一樣。

靜態方法和類方法的區別在於:

  • 靜態方法對類一無所知,隻處理參數
  • 類方法適用於類,因為它的參數始終是類本身。

類方法可以被類及其對象調用。

Class.classmethod()
Or even
Class().classmethod()

但無論如何,類方法總是附加到一個類,第一個參數作為類本身 cls

def classMethod(cls, args...)

示例 1:使用 classmethod() 創建類方法

class Person:
    age = 25

    def printAge(cls):
        print('The age is:', cls.age)

# create printAge class method
Person.printAge = classmethod(Person.printAge)

Person.printAge()

輸出

The age is: 25

在這裏,我們有一個類 Person ,其成員變量 age 分配給 25。

我們還有一個函數printAge,它采用單個參數cls,而不是我們通常采用的self

cls 接受類 Person 作為參數而不是 Person 的對象/實例。

現在,我們將方法 Person.printAge 作為參數傳遞給函數 classmethod 。這會將方法轉換為類方法,以便它接受第一個參數作為類(即 Person)。

在最後一行中,我們調用printAge,而不像為靜態方法那樣創建 Person 對象。這將打印類變量 age

什麽時候使用類方法?

1.工廠方法

工廠方法是那些為不同用例返回類對象(如構造函數)的方法。

它類似於 C++ 中的函數重載。因為,Python 沒有這樣的東西,所以使用類方法和靜態方法。

示例 2:使用類方法創建工廠方法

from datetime import date

# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)

    def display(self):
        print(self.name + "'s age is: " + str(self.age))

person = Person('Adam', 19)
person.display()

person1 = Person.fromBirthYear('John',  1985)
person1.display()

輸出

Adam's age is: 19
John's age is: 31

在這裏,我們有兩個類實例創建者,一個構造函數和一個fromBirthYear 方法。

構造函數采用普通參數 nameage 。而 fromBirthYear 采用 class , namebirthYear ,通過用當前年份減去它來計算當前年齡並返回類實例。

fromBirthYear 方法將 Person 類(不是 Person 對象)作為第一個參數 cls 並通過調用 cls(name, date.today().year - birthYear) 返回構造函數,相當於 Person(name, date.today().year - birthYear)

在方法之前,我們看到 @classmethod 。這稱為 decorator 用於將 fromBirthYear 轉換為類方法 classmethod()

2.繼承中正確創建實例

每當您通過將工廠方法實現為類方法來派生類時,它都會確保正確創建派生類的實例。

您可以為上麵的示例創建一個靜態方法,但它創建的對象將始終被硬編碼為基類。

但是,當您使用類方法時,它會創建派生類的正確實例。

示例 3:類方法如何用於繼承?

from datetime import date

# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def fromFathersAge(name, fatherAge, fatherPersonAgeDiff):
        return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff)

    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)

    def display(self):
        print(self.name + "'s age is: " + str(self.age))

class Man(Person):
    sex = 'Male'

man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))

man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))

輸出

True
False

在這裏,使用靜態方法創建類實例希望我們在創建過程中對實例類型進行硬編碼。

Person 繼承到 Man 時,這顯然會導致問題。

fromFathersAge 方法不返回 Man 對象,而是返回其基類 Person 的對象。

這違反了 OOP 範式。使用類方法作為fromBirthYear可以保證代碼的OOP-ness,因為它將第一個參數作為類本身並調用其工廠方法。

相關用法


注:本文由純淨天空篩選整理自 Python classmethod()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。