Метод classmethod () повертає метод класу для даної функції.
Синтаксис classmethod()
методу:
classmethod (функція)
classmethod()
вважається непитонічним, тому в нових версіях Python ви можете використовувати @classmethod
декоратор для визначення методу класу.
Синтаксис:
@classmethod def func (cls, args …)
Параметри classmethod ()
classmethod()
метод приймає один параметр:
- function - Функція, яку потрібно перетворити на метод класу
Повернене значення з classmethod ()
classmethod()
метод повертає метод класу для даної функції.
Що таке метод класу?
Метод класу - це метод, який прив’язаний до класу, а не до його об’єкта. Це не вимагає створення екземпляра класу, подібно до staticmethod.
Різниця між статичним методом і методом класу полягає в:
- Статичний метод нічого не знає про клас і просто має справу з параметрами
- Метод класу працює з класом, оскільки його параметром завжди є сам клас.
Метод класу може бути викликаний як класом, так і його об'єктом.
Class.classmethod () Або навіть 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()
Вихідні дані
Вік: 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
метод.
The constructor takes normal parameters name and age. While, fromBirthYear
takes class, name and birthYear, calculates the current age by subtracting it with the current year and returns the class instance.
The fromBirthYear method takes Person class (not Person object) as the first parameter cls and returns the constructor by calling cls(name, date.today().year - birthYear)
, which is equivalent to Person(name, date.today().year - birthYear)
Before the method, we see @classmethod
. This is called a decorator for converting fromBirthYear
to a class method as classmethod()
.
2. Correct instance creation in inheritance
Whenever you derive a class from implementing a factory method as a class method, it ensures correct instance creation of the derived class.
You can create a static method for the above example but the object it creates, will always be hardcoded as Base class.
Але, коли ви використовуєте метод класу, він створює правильний екземпляр похідного класу.
Приклад 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))
Вихідні дані
Справжнє хибне
Тут використання статичного методу для створення екземпляра класу вимагає від нас жорсткого кодування типу екземпляра під час створення.
Це однозначно спричиняє проблему при спадкуванні Person
до Man
.
fromFathersAge
метод повертає не Man
об'єкт, а об'єкт базового класу Person
.
Це порушує парадигму ООП. Використання методу класу fromBirthYear
може забезпечити ООП-код коду, оскільки він приймає перший параметр як сам клас і викликає свій заводський метод.