Статический метод Python — Как использовать без усилий?
Python’s Instance, Class, and Static Methods Demystified
by Dan Bader
В этом уроке я помогу разобраться в различиях между инстанс-методами, методами класса и статическими методами в языке программирования Python.
Если вы поймете их различия, вы сможете писать объектно-ориентированный код на Python, который более ясно передает свою цель и будет легче поддерживать в долгосрочной перспективе.
Инстанс-методы, методы класса и статические методы - общий обзор
Давайте начнем с написания простого класса (Python 3), содержащего примеры для всех трех типов методов:
Инстанс-методы
Первый метод в классе MyClass
, называемый method
, это обычный инстанс-метод. Это основной метод, который вы будете использовать в большинстве случаев. Вы можете видеть, что метод принимает один параметр self
, который указывает на экземпляр MyClass
при вызове метода (однако, конечно, инстанс-методы могут принимать больше одного параметра).
С помощью параметра self
, инстанс-методы свободно могут обращаться к атрибутам и другим методам этого же объекта. Это дает им много возможностей для изменения состояния объекта.
Инстанс-методы также имеют доступ к самому классу через атрибут self.__class__
. Это означает, что инстанс-методы также могут изменять состояние класса.
Методы класса
Давайте сравним это со вторым методом MyClass.classmethod
. Я пометил этот метод декоратором @classmethod
, чтобы указать, что это метод класса.
Вместо того, чтобы принимать параметр self
, методы класса принимают параметр cls
, который указывает на класс - а не на экземпляр объекта - при вызове метода.
Поскольку метод класса имеет доступ только к аргументу cls
, он не может изменить состояние экземпляра объекта. Для этого требуется доступ к self
. Однако, методы класса все равно могут изменять состояние класса, которое распространяется на все экземпляры класса.
Статические методы
Третий метод MyClass.staticmethod
помечен декоратором @staticmethod
.
Статические методы не привязаны ни к экземплярам, ни к классам. Они могут быть использованы внутри класса и не могут получить доступ к атрибутам класса или экземпляра объекта. Они работают подобно обычным функциям, просто находясь в области видимости класса.
Статические методы полезны, когда вам нужно произвести какую-то логику, связанную с классом, но без доступа к его атрибутам.
Давайте увидим все эти методы в действии!
Теперь у нас есть класс MyClass
, содержащий все три типа методов. Давайте вызовем каждый из них и посмотрим на результаты:
Результат:
Вкусные фабрики пиццы с помощью @classmethod
@classmethod
может быть полезным для создания фабричных методов, которые создают экземпляры класса с использованием различных параметров.
Давайте рассмотрим пример класса Pizza
, который имеет класс-атрибут toppings
, определенный на уровне класса. Для создания экземпляра Pizza
с различным набором топпингов, мы можем использовать @classmethod
для определения метода-фабрики:
Далее, для создания экземпляров Pizza
с помощью фабричных методов, мы можем вызвать методы класса:
Когда использовать статические методы
Статические методы полезны, когда вам нужно реализовать логику, которая не зависит ни от экземпляра, ни от класса.
Давайте рассмотрим пример класса MathUtils
, который содержит несколько статических методов для выполнения математических операций:
Далее, мы можем использовать статические методы без создания экземпляра класса:
Итоги
В этом уроке мы рассмотрели различия между инстанс-методами, методами класса и статическими методами в Python.
- Инстанс-методы могут изменять и получать доступ к состоянию экземпляра и классу через
self
. - Методы класса могут изменять состояние класса, но не имеют доступа к состоянию экземпляра.
- Статические методы не привязаны ни к экземплярам, ни к классам, и не могут получить доступ к состоянию класса или экземпляра.
Использование правильного типа метода в вашем коде поможет вам создавать более ясный и модульный объектно-ориентированный код на Python.