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

офферы быстрее!
Следующий вопрос
Это единственный вопрос по вашему фильтру