English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Python

Управление потоком Python

Функции Python

Типы данных Python

Операции с файлами Python

Объекты и классы Python

Даты и время Python

Продвинутые знания Python

Руководство Python

Метод использования classmethod() в Python и примеры

Внутренние функции Python

Метод classmethod() возвращает классовый метод для заданной функции.

Грамматика метода classmethod():

classmethod(function)

classmethod() считается несоответствующим стандарту Python, поэтому в более новых версиях Python можно использовать декоратор @classmethod для определения классовых методов.

Грамматика:

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

Параметр classmethod()

Метод classmethod() принимает один параметр:

  • function-Функция, которую нужно преобразовать в классовый метод

Возврат classmethod()

Метод classmethod() возвращает классовый метод для заданной функции.

Что такое классовый метод?

Классовые методы привязаны к классу, а не к объекту. Они не требуют создания примера класса, какclassmethod (статический метод)одинаковы.

Разница между статическими и классовыми методами:

  • Статические методы не знают о классе, они обрабатывают только параметры

  • Классовые методы используются вместе с классом, потому что их параметр всегда сам класс.

Классовые методы могут быть вызваны как самим классом, так и его объектами.

Class.classmethod()
Или даже
Class().classmethod()

Но无论如何, классовый метод всегда добавляется к классу с первым параметром, потому что класс сам являетсяcls.

def classMethod(cls, args...)

Пример 1: создание классового метода с помощью classmethod()

class Person:
    age = 25
    def printAge(cls):
        print('возраст:', cls.age)
# создать классовый метод printAge
Person.printAge = classmethod(Person.printAge)
Person.printAge()

При выполнении этого программы, вывод будет следующим:

возраст: 25

Здесь у нас есть класс Person, у которого есть переменные членавозрастустановлено значение 25.

У нас есть функция printAge, которая принимает один параметр cls, а не self, как мы обычно используем.

clsпринимает класс Person в качестве параметра, а не объект/пример Person.

Теперь мы передаем метод Person.printAge в качестве параметра этой функции classmethod. Это преобразует метод в метод класса, чтобы он принимал первый параметр в качестве класса (то есть Person).

В последней строке при вызове printAge не было создано объекта Person, как это было в статическом методе. Это будет напечатать классовую переменнуювозраст.

Когда использовать метод класса?

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()

При выполнении этого программы, вывод будет следующим:

Возраст Адама: 19
Возраст Джона: 31

Здесь у нас есть два создателя примеров класса, это конструктор и метод fromBirthYear.

Конструктор принимает обычные параметрыимяивозраст. А fromBirthYear принимаетcls,имяиbirthYear, вычисляя текущий возраст, вычитая текущий год из текущего года, и возвращая пример класса.

Метод fromBirthYear принимает Person класс (не объект Person) в качестве первого параметраcls,и через вызов возвращает конструктор cls(name, date.today().year - birthYear), что эквивалентно Person(name, date.today().year - birthYear)

До этого метода我们看到 @classmethod. Это называетсяДекоратор,Классовый метод для преобразования fromBirthYear в classmethod()

2. Правильное создание примера в наследовании

Когда метод фабрики реализуется как метод класса для создания производного класса, он может обеспечить правильное создание примера производного класса.

Для上面的 примера можно создать статический метод, но объект, который он создает, всегда будет закодирован в классе Base.

Но при использовании метода класса, он создает правильный пример производного класса.

Пример 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 гарантирует面向 объектное программирование, так как он использует первый аргумент в качестве самого класса и вызывает его фабричный метод.

Внутренние функции Python