English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Метод classmethod() возвращает классовый метод для заданной функции.
Грамматика метода classmethod():
classmethod(function)
classmethod() считается несоответствующим стандарту Python, поэтому в более новых версиях Python можно использовать декоратор @classmethod для определения классовых методов.
Грамматика:
@classmethod def func(cls, args...)
Метод classmethod() принимает один параметр:
function-Функция, которую нужно преобразовать в классовый метод
Метод classmethod() возвращает классовый метод для заданной функции.
Классовые методы привязаны к классу, а не к объекту. Они не требуют создания примера класса, какclassmethod (статический метод)одинаковы.
Разница между статическими и классовыми методами:
Статические методы не знают о классе, они обрабатывают только параметры
Классовые методы используются вместе с классом, потому что их параметр всегда сам класс.
Классовые методы могут быть вызваны как самим классом, так и его объектами.
Class.classmethod() Или даже Class().classmethod()
Но无论如何, классовый метод всегда добавляется к классу с первым параметром, потому что класс сам являетсяcls.
def classMethod(cls, args...)
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, как это было в статическом методе. Это будет напечатать классовую переменнуювозраст.
Фабричные методы - это методы, которые возвращает объект класса (например, конструктор) для различных сценариев использования.
Это аналогично функции перегрузки в C++. Поскольку в Python такой функции нет, используются методы класса и статические методы.
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()
Когда метод фабрики реализуется как метод класса для создания производного класса, он может обеспечить правильное создание примера производного класса.
Для上面的 примера можно создать статический метод, но объект, который он создает, всегда будет закодирован в классе Base.
Но при использовании метода класса, он создает правильный пример производного класса.
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 гарантирует面向 объектное программирование, так как он использует первый аргумент в качестве самого класса и вызывает его фабричный метод.