Как использовать `@staticmethod` для добавления статического метода в класс?

Декоратор @staticmethod используется для определения статических методов в классе. Статический метод не принимает неявный первый аргумент (self или cls). Он вызывается непосредственно из класса, а не из экземпляра класса.
Пример:

class MyClass:
    @staticmethod
    def my_static_method(arg1, arg2):
        return arg1 + arg2

result = MyClass.my_static_method(5, 3) # Calling directly on the class
print(result) # Output: 8
  

Для добавления статического метода в класс в Python используется декоратор @staticmethod. Статические методы отличаются от обычных методов экземпляра (instance methods) и методов класса (class methods) тем, что они не получают ни экземпляр класса (self), ни сам класс (cls) в качестве первого аргумента. Они ведут себя как обычные функции, определенные внутри класса, но логически связаны с классом.

Как использовать @staticmethod:

  1. Определение метода: Определите метод внутри класса, который не принимает self или cls в качестве первого аргумента.
  2. Использование декоратора: Непосредственно перед определением метода добавьте декоратор @staticmethod.

Пример:

class MyClass:
    def __init__(self, value):
      self.value = value

    @staticmethod
    def add(x, y):
      return x + y

    def instance_method(self):
      return self.value * 2

Как вызвать статический метод:

Статический метод можно вызвать как через имя класса, так и через экземпляр класса, но рекомендуется вызывать через имя класса, чтобы подчеркнуть его статическую природу. Вызов статического метода не требует создания экземпляра класса.

# Вызов через класс
  result = MyClass.add(5, 3)
  print(result)  # Output: 8

  # Вызов через экземпляр (не рекомендуется, но допустимо)
  instance = MyClass(10)
  result = instance.add(5, 3)
  print(result)  # Output: 8

  print(instance.instance_method()) # Output: 20 (обычный метод экземпляра)

Когда использовать @staticmethod:

  • Когда логика метода логически связана с классом, но не требует доступа к состоянию конкретного экземпляра или класса.
  • Когда метод представляет собой вспомогательную функцию (utility function), полезную для работы с классом.
  • Для организации кода, чтобы функции, связанные с классом, были сгруппированы внутри него.

В отличие от методов экземпляра:

Методы экземпляра (обычные методы) автоматически получают доступ к экземпляру класса через аргумент self, что позволяет им изменять состояние экземпляра и вызывать другие методы экземпляра.

class Example:
    def __init__(self, value):
      self.value = value

    def increment(self, amount):
      self.value += amount  # Изменение состояния экземпляра
      return self.value

  obj = Example(5)
  print(obj.increment(3)) # Output: 8
0