Python classmethod ()

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

Синтаксисът на classmethod()метода е:

 classmethod (функция)

classmethod()се счита за не-Pythonic, така че в по-новите версии на Python можете да използвате @classmethodдекоратора за дефиниране на classmethod.

Синтаксисът е:

 @classmethod def func (cls, args …)

classmethod () Параметри

classmethod() метод взема един параметър:

  • функция - Функция, която трябва да бъде преобразувана в метод на клас

Върната стойност от 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метод.

Конструкторът взема нормални параметри име и възраст. Докато fromBirthYearвзема клас, име и година на раждане, изчислява текущата възраст, като я изважда с текущата година и връща екземпляра на класа.

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

Преди метода виждаме @classmethod. Това се нарича декоратор за преобразуване 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))

Изход

 Вярно невярно 

Тук използването на статичен метод за създаване на екземпляр на клас иска да хардираме типа на екземпляра по време на създаването.

Това очевидно създава проблем при наследяване Personна Man.

fromFathersAgeметодът не връща Manобект, а обекта на базовия клас Person.

Това нарушава парадигмата на ООП. Използването на метод на клас, който fromBirthYearможе да осигури OOP-ността на кода, тъй като той приема първия параметър като самия клас и извиква фабричния му метод.

Интересни статии...