В этом уроке вы узнаете о статических методах Python и о том, как их использовать для создания служебного класса.
Что такое статические методы в Python?
До сих пор вы изучали методы экземпляра, привязанные к конкретному экземпляру. Это означает, что методы экземпляра могут получать доступ к состоянию связанного объекта и изменять его. Кроме того, вы узнали о методах класса, привязанных к классу. Методы класса могут получать доступ к состоянию класса и изменять его.
В отличие от методов экземпляра, статические методы не привязаны к объекту. Другими словами, статические методы не могут получить доступ к состоянию объекта и изменить его.
Кроме того, Python не передает параметр cls (или параметр self) неявно в статические методы. Следовательно, статические методы не могут получить доступ к состоянию класса и изменить его.
На практике статические методы используются для определения служебных методов или групповых функций, которые имеют некоторые логические связи в классе.
Чтобы определить статический метод, используйте декоратор @staticmethod:
class className:
@staticmethod
def static_method_name(param_list):
pass
Чтобы вызвать статический метод, используйте следующий синтаксис:
className.static_method_name()
Сравнение статических методов и методов класса в Python
Поскольку статические методы очень похожи на методы класса, вы можете использовать следующее сравнение, чтобы найти различия между ними:
| Методы класса | Статические методы |
|---|---|
| Python неявно передает аргумент cls методам класса. | Python не передает аргумент cls неявно статическим методам. |
| Методы класса могут получать доступ к состоянию класса и изменять его. | Статические методы не могут получить доступ к состоянию класса или изменить его. |
| Используйте декораторы @classmethod для определения методов класса. | Используйте декораторы @staticmethod для определения статических методов. |
Примеры статических методов Python
Ниже определяется класс под названием «TemperatureConverter», который имеет статические методы для преобразования температур между градусами Цельсия, Фаренгейта и Кельвина:
class TemperatureConverter:
KEVIN = 'K',
FAHRENHEIT = 'F'
CELSIUS = 'C'
@staticmethod
def celsius_to_fahrenheit(c):
return 9*c/5 + 32
@staticmethod
def fahrenheit_to_celsius(f):
return 5*(f-32)/9
@staticmethod
def celsius_to_kelvin(c):
return c + 273.15
@staticmethod
def kelvin_to_celsius(k):
return k - 273.15
@staticmethod
def fahrenheit_to_kelvin(f):
return 5*(f+459.67)/9
@staticmethod
def kelvin_to_fahrenheit(k):
return 9*k/5 - 459.67
@staticmethod
def format(value, unit):
symbol=""
if unit == TemperatureConverter.FAHRENHEIT:
symbol="°F"
elif unit == TemperatureConverter.CELSIUS:
symbol="°C"
elif unit == TemperatureConverter.KEVIN:
symbol="°K"
return f'{value}{symbol}'
А для вызова класса TemperatureConverter вы используете следующее:
f = TemperatureConverter.celsius_to_fahrenheit(35) print(TemperatureConverter.format(f, TemperatureConverter.FAHRENHEIT))
