В чем разница между статическим методом и класс-методом в Python

Ответ

Основное различие заключается в первом аргументе, который они получают (или не получают), что определяет их возможности.

Статический метод (@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: для создания альтернативных конструкторов (фабричных методов) или для операций, которые должны работать с классом в целом.