Python classmethod ()

Метод 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може забезпечити ООП-код коду, оскільки він приймає перший параметр як сам клас і викликає свій заводський метод.

Цікаві статті...