Исследование методов, декораторов и наследования в Python

Обычный метод получает self, staticmethod не получает скрытого аргумента, classmethod получает cls, а property вызывается как атрибут. StudentPlus наследует всё это и меняет default_course.

Короткий ответ

Что ответить на собеседовании

Обычный метод получает 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, поэтому прямое присваивание свойству запрещено. Статический метод не зависит от конкретного экземпляра и может вызываться через класс.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее