Метод Python classmethod — возвращает метод класса для данной функции.
class Student:
marks = 0
def compute_marks(self, obtained_marks):
marks = obtained_marks
print('Obtained Marks:', marks)
# преобразовываем compute_marks() в метод класса
Student.print_marks = classmethod(Student.compute_marks)
Student.print_marks(88)
# Output: Obtained Marks: 88
Синтаксис метода classmethod()
classmethod(function)
использование classmethod() считается не питоническим, поэтом в современных версиях Python, вы можете воспользоваться декоратором @classmethod для определения метода классов.
Синтаксис вызова декоратора, выглядит следующим образом.
@classmethod def func(cls, args...)
Параметры и возвращаемые значения метода classmethod()
classmethod() — принимает единственный параметр функцию. Передаем в качестве параметра функцию, которую необходимо преобразовать в метод класса. В качестве возвращаемого значения, метод classmethod() — возвращает метод класса для данной функции.
Что такое метод класса?
Метод класса — это метод привязанный к классу, а не к его объекту. Данный подход не требует создания экземпляра класса. Разница между статическим методом, и методом класса заключается в следующем:
- Статический метод ничего не знает о классе, и просто работает с параметрами
- Метод класса работает непосредственно с самим классом, так как его параметром всегда является сам класс.
Метод класса может вызываться как самим классом, так и его объектом.
Пример 1. Создаем метод класса с помощью метода classmethod()
class Person:
age = 25
def printAge(cls):
print('The age is:', cls.age)
# создаем printAge метод класса
Person.printAge = classmethod(Person.printAge)
Person.printAge()
#Результат: The age is: 25
- В данном случае у нас есть class Person, в с переменной age у которого значение 25
- Есть функция printAge, которая принимает один параметр cls, а не self, как мы это обычно делаем.
- cls — принимает в качестве параметра класс Person
- Затем мы передаем метод Person.printAge в качестве аргумента функции classmethod(), что позволяет нам преобразовать метод, в метод класса
- Далее мы вызываем printAge() без создания объекта Person, как это принято в статических методах. При этом выводится переменная класса age
Пример 2. Метод класса с помощью classmethod()
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()
#Результат
Adam's age is: 19
John's age is: 31
- В данном случае, у нас создатель двух классов, конструктор и метод fromBirthYear
- Конструктор принимает обычные параметры name и age.
- Метод fromBirthYear принимает cls, name, birthYear (вычисляет текущий возраст, вычитывая его с текущим годом и возвращает экземпляр класса)
- Метод fromBirthYear принимает класс Person (не объект) в качестве первого параметра cls, и возвращает путем вызова
cls(name, date.today().year - birthYear) что является эквивалентом Person(name, date.today().year - birthYear)
- Перед методом, мы видим @classmethod, это называется декоратором, для преобразования fromBirthYear в метод класса.