В чем разница между @staticmethod и @classmethod

Python Junior Без компании
В чем разница между @staticmethod и @classmethod
Ответы
`@staticmethod` и `@classmethod` — это декораторы в Python для создания методов, которые не привязаны к экземпляру класса. Но они имеют ключевые различия: **1.** `@staticmethod` **(Статический метод)** **- Не получает неявных аргументов** (ни `self`, ни `cls`) **- Не имеет доступа** к классу или его экземплярам **- Ведет себя как обычная функция**, но принадлежит пространству имен класса Вызывается как от класса, так и от экземпляра *Пример:* ``` class MathUtils: @staticmethod def add(a, b): return a + b # Не знает о классе # Использование print(MathUtils.add(5, 3)) # 8 obj = MathUtils() print(obj.add(2, 2)) # 4 ``` **2.** `@classmethod` **(Метод класса)** **- Получает класс** в качестве первого аргумента (обычно называют `cls`) **- Имеет доступ к классу** и может изменять его состояние - Может использоваться как **альтернативный конструктор** Вызывается как от класса, так и от экземпляра *Пример:* ``` class Person: count = 0 def __init__(self, name): self.name = name Person.count += 1 @classmethod def get_count(cls): return cls.count # Имеет доступ к классу @classmethod def from_string(cls, string_data): # Альтернативный конструктор name = string_data.split('-')[0] return cls(name) # Создает новый экземпляр # Использование person1 = Person("Alice") person2 = Person.from_string("Bob-25") print(Person.get_count()) # 2 (обращается к классу) print(person1.get_count()) # 2 (все равно получает класс) ``` ### **Когда что использовать:** `@staticmethod` — когда метод не нуждается в доступе к классу или экземпляру (математические операции, утилиты) `@classmethod` — когда нужно работать с классом как с целым (подсчет экземпляров, альтернативные конструкторы)