Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Представим, что у нас есть класс MathUtils, который содержит статический метод для вычисления факториала:
class MathUtils:
@staticmethod
def factorial(n):
if n == 0:
return 1
else:
return n * MathUtils.factorial(n-1)
print(MathUtils.factorial(5))
120Получили факториал 5, то есть 120. Здесь статический метод factorial не использует никакие атрибуты экземпляра класса, а только входной аргумент n. И мы вызвали его, используя синтаксис MathUtils.factorial(n) и не создавая экземпляр класса MathUtils.
Далее отметим, что статические методы в Python могут использоваться не только в классах, но также в модулях и пакетах. Если вы определяете функцию в модуле и не хотите, чтобы она была связана с экземпляром класса или модулем, вы можете использовать декоратор @staticmethod для объявления этой функции как статической.
Допустим, у нас есть модуль StringUtils, содержащий статический метод для проверки, является ли строка палиндромом. Пишем такой код:
def is_palindrome(string):
return string == string[::-1]Здесь функция is_palindrome не связана с каким-либо экземпляром класса или объектом модуля, поэтому мы можем использовать декоратор @staticmethod для объявления ее как статической. Для этого расширим наш код таким образом:
class StringUtils:
@staticmethod
def is_palindrome(string):
return string == string[::-1]Далее введем для проверки:
print(StringUtils.is_palindrome("топот"))
True
print(StringUtils.is_palindrome("топор"))
FalseВсё верно, первое слово является палиндромом, поэтому интерпретатор вывел True, а второе нет, и мы получили False.
Таким образом, мы можем вызвать метод is_palindrome через класс StringUtils, используя синтаксис StringUtils.is_palindrome(string) вместо того, чтобы импортировать функцию is_palindrome и вызывать ее напрямую.
Еще одно важное отличие статических методов от методов экземпляров класса в Python заключается в том, что статические методы не могут изменять состояние экземпляра. Это означает, что они не могут изменять значения атрибутов, что логично, так как они не имеют доступа к экземпляру. Если вы хотите изменить состояние экземпляра класса, вам нужно использовать методы экземпляров.
Рассмотрим еще один пример. Допустим, у нас есть класс Person, имеющий атрибут age и статический метод is_adult, проверяющий значение на соответствие возрасту совершеннолетия:
class Person:
def __init__(self, age):
self.age = age
@staticmethod
def is_adult(age):
return age >= 18Далее давайте создадим переменную age со значением 21, вызовем статический метод is_adult из класса Person с этим значением и сохраним его результат в переменную****is_adult, вот так:
age = 21
is_adult = Person.is_adult(age)Теперь для проверки давайте введем:
Поскольку возраст соответствует заданному в статическом методе условию, мы получили True. В примере выше статический метод is_adult принимает аргумент age, но не имеет доступа к атрибуту age экземпляра класса Person, выступая в качестве вспомогательной функции.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.