Автор оригинала: 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.