В чем разница между @staticmethod и @classmethod
Python
Middle
Без компании
В чем разница между @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` — когда нужно работать с классом как с целым (подсчет экземпляров, альтернативные конструкторы)