Какие существуют виды методов в классах 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()) # Вызов статического метода

Ответ 18+ 🔞

Смотри, вот тебе про методы в питоне, чтоб ты не путался, как последний распиздяй. Три штуки есть, и каждая — своя мудя.

Первые — методы экземпляра.
Это, блядь, самые обычные, их все знают. Первый аргумент — self, то есть сам объект, конкретная сущность. Через них ты ковыряешь состояние вот этой вот конкретной пиццы, машины или чего ты там накодил. Без них нихуя не работает.

Вторые — методы класса.
Тут уже декоратор @classmethod и первый аргумент — cls, то есть сам класс, а не экземпляр. Зачем? Ну, например, чтобы сделать фабричный метод — альтернативный конструктор. Не через __init__ создавать, а как-то по-другому, с преобразованием данных. Логика связана с классом в целом, а не с отдельным объектом.

Третьи — статические методы.
Вешаешь @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()) # Вызов статического метода

Вот и вся магия. Главное — не путай, а то получится каша, а не код. И да, статические методы — это не про то, чтобы просто так, от хуйни, всё помечать @staticmethod. Если логика не требует доступа к классу или экземпляру — ок. Если требует — ты просто мудак, который не разобрался.