Ответ
В классах Python существует три основных вида методов, различающихся по первому аргументу и области применения:
-
Методы экземпляра (Instance Methods)
- Принимают
self(экземпляр класса) в качестве первого аргумента. - Назначение: Работа с состоянием конкретного объекта. Это самый распространенный тип методов.
- Принимают
-
Методы класса (Class Methods)
- Декорируются
@classmethodи принимаютcls(сам класс) в качестве первого аргумента. - Назначение: Работа с классом в целом, а не с его экземпляром. Часто используются для создания альтернативных конструкторов (фабричных методов).
- Декорируются
-
Статические методы (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. Если логика не требует доступа к классу или экземпляру — ок. Если требует — ты просто мудак, который не разобрался.