Методът 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-ността на кода, тъй като той приема първия параметър като самия клас и извиква фабричния му метод.