Пропустить до содержимого

Статический метод Python — Как использовать без усилий?

[

Python’s Instance, Class, and Static Methods Demystified

by Dan Bader

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

Если вы поймете их различия, вы сможете писать объектно-ориентированный код на Python, который более ясно передает свою цель и будет легче поддерживать в долгосрочной перспективе.

Инстанс-методы, методы класса и статические методы - общий обзор

Давайте начнем с написания простого класса (Python 3), содержащего примеры для всех трех типов методов:

class MyClass:
def method(self):
return 'Вызван инстанс-метод', self
@classmethod
def classmethod(cls):
return 'Вызван метод класса', cls
@staticmethod
def staticmethod():
return 'Вызван статический метод'

Инстанс-методы

Первый метод в классе MyClass, называемый method, это обычный инстанс-метод. Это основной метод, который вы будете использовать в большинстве случаев. Вы можете видеть, что метод принимает один параметр self, который указывает на экземпляр MyClass при вызове метода (однако, конечно, инстанс-методы могут принимать больше одного параметра).

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

Инстанс-методы также имеют доступ к самому классу через атрибут self.__class__. Это означает, что инстанс-методы также могут изменять состояние класса.

Методы класса

Давайте сравним это со вторым методом MyClass.classmethod. Я пометил этот метод декоратором @classmethod, чтобы указать, что это метод класса.

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

Поскольку метод класса имеет доступ только к аргументу cls, он не может изменить состояние экземпляра объекта. Для этого требуется доступ к self. Однако, методы класса все равно могут изменять состояние класса, которое распространяется на все экземпляры класса.

Статические методы

Третий метод MyClass.staticmethod помечен декоратором @staticmethod.

Статические методы не привязаны ни к экземплярам, ни к классам. Они могут быть использованы внутри класса и не могут получить доступ к атрибутам класса или экземпляра объекта. Они работают подобно обычным функциям, просто находясь в области видимости класса.

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

Давайте увидим все эти методы в действии!

Теперь у нас есть класс MyClass, содержащий все три типа методов. Давайте вызовем каждый из них и посмотрим на результаты:

my_obj = MyClass()
print(my_obj.method())
print(MyClass.classmethod())
print(MyClass.staticmethod())

Результат:

Вызван инстанс-метод (<__main__.MyClass object at 0x7f40673e3190>,)
Вызван метод класса <class '__main__.MyClass'>
Вызван статический метод

Вкусные фабрики пиццы с помощью @classmethod

@classmethod может быть полезным для создания фабричных методов, которые создают экземпляры класса с использованием различных параметров.

Давайте рассмотрим пример класса Pizza, который имеет класс-атрибут toppings, определенный на уровне класса. Для создания экземпляра Pizza с различным набором топпингов, мы можем использовать @classmethod для определения метода-фабрики:

class Pizza:
toppings = ['cheese']
def __init__(self, toppings):
self.toppings = toppings
@classmethod
def margherita(cls):
return cls(['cheese', 'tomatoes', 'basil'])
@classmethod
def pepperoni(cls):
return cls(['cheese', 'pepperoni'])

Далее, для создания экземпляров Pizza с помощью фабричных методов, мы можем вызвать методы класса:

margherita = Pizza.margherita()
print(margherita.toppings) # ['cheese', 'tomatoes', 'basil']
pepperoni = Pizza.pepperoni()
print(pepperoni.toppings) # ['cheese', 'pepperoni']

Когда использовать статические методы

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

Давайте рассмотрим пример класса MathUtils, который содержит несколько статических методов для выполнения математических операций:

class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
@staticmethod
def subtract(a, b):
return a - b

Далее, мы можем использовать статические методы без создания экземпляра класса:

print(MathUtils.add(2, 3)) # 5
print(MathUtils.multiply(4, 5)) # 20
print(MathUtils.subtract(10, 7)) # 3

Итоги

В этом уроке мы рассмотрели различия между инстанс-методами, методами класса и статическими методами в Python.

  • Инстанс-методы могут изменять и получать доступ к состоянию экземпляра и классу через self.
  • Методы класса могут изменять состояние класса, но не имеют доступа к состоянию экземпляра.
  • Статические методы не привязаны ни к экземплярам, ни к классам, и не могут получить доступ к состоянию класса или экземпляра.

Использование правильного типа метода в вашем коде поможет вам создавать более ясный и модульный объектно-ориентированный код на Python.