Ответ
Основное различие заключается в первом аргументе, который они получают (или не получают), что определяет их возможности.
Статический метод (@staticmethod
)
Не получает никаких обязательных первых аргументов (self
или cls
). Это, по сути, обычная функция, помещенная в пространство имен класса для логической группировки. Она не может изменять состояние класса или экземпляра.
Класс-метод (@classmethod
)
Получает класс в качестве первого неявного аргумента, который по соглашению называется cls
. Это позволяет методу работать с самим классом, например, обращаться к его атрибутам или создавать экземпляры класса (фабричные методы).
Сравнительный пример:
class MyClass:
class_variable = 10
def __init__(self, value):
self.instance_variable = value
@staticmethod
def static_method(x, y):
# Не имеет доступа ни к class_variable, ни к instance_variable
# Просто утилитарная функция
return x + y
@classmethod
def class_method(cls, value_for_new_instance):
# Имеет доступ к атрибутам класса, например, cls.class_variable
print(f"Class variable: {cls.class_variable}")
# Может создавать экземпляры класса (фабричный метод)
return cls(value_for_new_instance)
# Вызов без создания экземпляра
print(MyClass.static_method(5, 3)) # Вывод: 8
# Создание экземпляра через класс-метод
instance = MyClass.class_method(100)
print(instance.instance_variable) # Вывод: 100
Когда что использовать:
@staticmethod
: для утилитарных функций, которые логически связаны с классом, но не зависят от его состояния.@classmethod
: для создания альтернативных конструкторов (фабричных методов) или для операций, которые должны работать с классом в целом.