当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。