Документация по Python. Теоретические материалы, и практические задачи

Python classmethod

Метод 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() считается не питоническим, поэтом в современных версиях 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  в метод класса.

 

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *