Обычный метод получает self, staticmethod не получает скрытого аргумента, classmethod получает cls, а property вызывается как атрибут. StudentPlus наследует всё это и меняет default_course.
Исследование методов, декораторов и наследования в Python
Обычный метод получает self, staticmethod не получает скрытого аргумента, classmethod получает cls, а property вызывается как атрибут. StudentPlus наследует всё это и меняет default_course.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом фрагменте кода показано, как устроены разные виды методов в классе, как применяется свойство и как реализовано наследование. Обратите внимание на:
- обычный метод
get_full_name, который формирует полное имя студента; - статический метод
get_greeting, не зависящий от состояния объекта; - метод класса
get_default_course, работающий с атрибутом класса; - свойство
is_lucky, которое вычисляет логическое значение на основе длины имени и возраста; - наследника
StudentPlus, переопределяющий атрибутdefault_courseи добавляющий новый методget_full_upper_case_name.
Опишите, какие именно методы и декораторы задействованы, как построена цепочка наследования и какие результаты возвращаются при вызове каждого из методов.
class Student:
default_course = 'Python Developer'
def __init__(self, name, surname, age):
self.name = name
self.surname = surname
self.age = age
def get_full_name(self):
return f'{self.name} {self.surname}'
@staticmethod
def get_greeting():
return 'Привет, студент!'
@classmethod
def get_default_course(cls):
return cls.default_course
@property
def is_lucky(self):
return len(self.name + self.surname) == self.age
class StudentPlus(Student):
default_course = 'Python Developer Plus'
def get_full_upper_case_name(self):
return f'{self.name} {self.surname}'.upper()
Ответ
Обычный метод получает self, staticmethod не получает скрытого аргумента, classmethod получает cls, а property вызывается как атрибут. StudentPlus наследует всё это и меняет default_course.
Пример:
student = StudentPlus('Иван', 'Иванов', 10)
student.get_full_name() # 'Иван Иванов'
student.get_greeting() # 'Привет, студент!'
student.get_default_course() # 'Python Developer Plus'
student.is_lucky # True: 4 + 6 == 10
student.get_full_upper_case_name() # 'ИВАН ИВАНОВ'
cls в унаследованном classmethod соответствует StudentPlus, поэтому берётся переопределённый атрибут. Student.get_default_course() по-прежнему возвращает 'Python Developer'. У is_lucky нет setter, поэтому прямое присваивание свойству запрещено. Статический метод не зависит от конкретного экземпляра и может вызываться через класс.