Какие существуют виды методов в классах Python и в чем их различия?

«Какие существуют виды методов в классах Python и в чем их различия?» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В классах Python существует три основных вида методов, различающихся по первому аргументу и области применения:

  1. Методы экземпляра (Instance Methods)

    • Принимают self (экземпляр класса) в качестве первого аргумента.
    • Назначение: Работа с состоянием конкретного объекта. Это самый распространенный тип методов.
  2. Методы класса (Class Methods)

    • Декорируются @classmethod и принимают cls (сам класс) в качестве первого аргумента.
    • Назначение: Работа с классом в целом, а не с его экземпляром. Часто используются для создания альтернативных конструкторов (фабричных методов).
  3. Статические методы (Static Methods)

    • Декорируются @staticmethod и не принимают self или cls в качестве обязательного первого аргумента.
    • Назначение: Логически связаны с классом, но не зависят ни от состояния класса, ни от состояния экземпляра. По сути, это обычные функции, помещенные в пространство имен класса.

Пример:

class Pizza:
    def __init__(self, radius):
        self.radius = radius # Атрибут экземпляра

    # 1. Метод экземпляра
    def get_area(self):
        # Работает с данными конкретной пиццы (self)
        return 3.14 * (self.radius ** 2)

    # 2. Метод класса (фабричный метод)
    @classmethod
    def from_diameter(cls, diameter):
        # Создает экземпляр, используя данные, связанные с классом
        return cls(diameter / 2)

    # 3. Статический метод
    @staticmethod
    def cook_instructions():
        # Не зависит ни от класса, ни от экземпляра
        return "Bake at 220°C for 15 minutes."

# Использование:
pizza_1 = Pizza(15)
print(f"Площадь первой пиццы: {pizza_1.get_area()}")

pizza_2 = Pizza.from_diameter(40) # Создание через метод класса
print(f"Радиус второй пиццы: {pizza_2.radius}")

print(Pizza.cook_instructions()) # Вызов статического метода