Автор оригинала: Pankaj Kumar.
@staticmethod в Python
@Staticmethod декоратор
Python @staticmethod Декоратор используется для обозначения метода класса в качестве статического метода, что означает, что его можно назвать без усмотра класса. Он просто определяет нормальную функцию, которая логически содержится в классе для читаемости. Здесь нам не нужно проходить экземпляр класса как первый аргумент через Я , в отличие от других классных функций.
class Student():
def __init__(self, mark):
self.mark = mark
@staticmethod
def find_min(mark):
return min(mark, 100)
print(Student.find_min(20))
Выход
20
Доступ к экземплярам классов
Статические методы также могут быть доступны через экземпляры или объекты классов. Например:
class Bank():
def __init__(self, balance):
self.balance = balance
@staticmethod
def find_interest(loan_money, interest_rate):
return loan_money * (1 + interest_rate)
bank = Bank(1000)
print(bank.find_interest(bank.balance, 0.3))
Выход:
1300
Переопределение статических методов
Определения статического метода неизменяются даже после любого наследования, что означает, что это
class ATM(Bank):
def __init__(self, balance):
super().__init__(balance)
@staticmethod
def find_interest(loan_money):
return loan_money * 1.4
atm = ATM(1000)
print(atm.find_interest(atm.balance))
Выход
1400
@staticmethod vs @classmethod.
Методы класса называются через класс, содержащий его, а не из экземпляра. Вот почему классMethod определяется как class_method (cls, param1, param2) , который не содержит Я , что означает, что его нельзя вызывать с использованием экземпляра класса. Статические методы могут быть вызваны как из экземпляра класса, так и из класса.
@staticmethod vs Методы экземпляра
Методы экземпляра могут быть вызваны только из экземпляра класса, поэтому любой метод экземпляра имеет форму instance_method (self, param1, param2) , где Я Ключевое слово означает, что экземпляр класса вызывает метод. @staticmethod Могут быть вызваны как из экземпляра класса, так и из класса.
Вот пример, чтобы поставить все это вместе.
class Bank():
def __init__(self, balance):
self.balance = balance
@staticmethod
def find_interest(loan_money, interest_rate):
return loan_money * (1 + interest_rate)
@classmethod
def find_interest_classmethod(cls, loan_money):
return loan_money * 1.4
def find_interest_instancemethod(self, loan_money):
if self.balance <= 100:
return loan_money * 1.2
else:
return loan_money * 1.5
class ATM(Bank):
def __init__(self, balance):
super().__init__(balance)
@staticmethod
def find_interest(loan_money):
return loan_money * 1.3
atm = ATM(1000)
print('Using staticmethod ->', atm.find_interest(atm.balance))
print('Using classmethod from the parent class ->', Bank.find_interest_classmethod(atm.balance))
print('Using classmethod from the inherited subclass ->', ATM.find_interest_classmethod(atm.balance))
print('Using a regular instance method ->', atm.find_interest_instancemethod(atm.balance))
Выход :
Using staticmethod -> 1300.0 Using classmethod from the parent class -> 1400.0 Using classmethod from the inherited subclass -> 1400.0 Using a regular instance method -> 1500.0
Заключение
Статические методы Python относятся к классу. Они полезны в создании функций, которые не нуждаются в переменных экземпляра для работы. Эта статья показала нам использование случаев @staticmethod и как они сравниваются с другими такими декораторами, а именно @classmethod decorator. Мы также дали сравнение статических методов, методами классов и обычными методами экземпляра и показали, как их можно использовать для упрощения кода класса.
использованная литература
Официальная документация Python: https://docs.cython.org/3/Library/functions.html#staticmethod.html#staticmethod.