Вбудована функція staticmethod () повертає статичний метод для даної функції.
Синтаксис staticmethod()
:
staticmethod (функція)
Використання staticmethod()
вважається непітонічним способом створення статичної функції.
Отже, в нових версіях Python ви можете використовувати @staticmethod
декоратор.
Синтаксис @staticmethod
:
@staticmethod def func (аргументи, …)
Параметри staticmethod ()
staticmethod()
Метод приймає один параметр:
- function - функція, яку потрібно перетворити на статичний метод
Повернене значення з staticmethod ()
У staticmethod()
повертає статичний метод для функції передається в якості параметра.
Що таке статичний метод?
Статичні методи, подібно до методів класу, - це методи, які прив'язані до класу, а не до його об'єкта.
Вони не потребують створення екземпляра класу. Отже, вони не залежать від стану об’єкта.
Різниця між статичним методом і методом класу полягає в:
- Статичний метод нічого не знає про клас і просто має справу з параметрами.
- Метод класу працює з класом, оскільки його параметром завжди є сам клас.
Їх може викликати як клас, так і його об’єкт.
Class.staticmethodFunc () або навіть Class (). StaticmethodFunc ()
Приклад 1: Створення статичного методу за допомогою staticmethod ()
class Mathematics: def addNumbers(x, y): return x + y # create addNumbers static method Mathematics.addNumbers = staticmethod(Mathematics.addNumbers) print('The sum is:', Mathematics.addNumbers(5, 10))
Вихідні дані
Сума: 15
Коли ви використовуєте статичні методи?
1. Групування функції корисності за класом
Статичні методи мають обмежений варіант використання, оскільки, як і методи класу або будь-які інші методи в класі, вони не можуть отримати доступ до властивостей самого класу.
Однак, коли вам потрібна функція утиліти, яка не має доступу до властивостей класу, але має сенс належність до класу, ми використовуємо статичні функції.
Приклад 2: Створіть функцію утиліти як статичний метод
class Dates: def __init__(self, date): self.date = date def getDate(self): return self.date @staticmethod def toDashDate(date): return date.replace("/", "-") date = Dates("15-12-2016") dateFromDB = "15/12/2016" dateWithDash = Dates.toDashDate(dateFromDB) if(date.getDate() == dateWithDash): print("Equal") else: print("Unequal")
Вихідні дані
Рівний
Тут у нас є Dates
клас, який працює лише з датами з тире. Однак у нашій попередній базі даних усі дати були представлені у скісних рисках.
Для того, щоб перетворити косу риску на дату, ми створили функцію утиліти toDashDate
всередині Dates
.
Це статичний метод, оскільки йому не потрібно отримувати доступ до будь-яких властивостей самого Dates
себе, а вимагає лише параметрів.
Ми також можемо створювати toDashDate
поза класом, але оскільки він працює лише на дати, логічно тримати його всередині Dates
класу.
2. Маючи єдину реалізацію
Статичні методи використовуються, коли ми не хочемо, щоб підкласи зміни класу / перевизначили конкретну реалізацію методу.
Приклад 3: Як працює успадкування за допомогою статичного методу?
class Dates: def __init__(self, date): self.date = date def getDate(self): return self.date @staticmethod def toDashDate(date): return date.replace("/", "-") class DatesWithSlashes(Dates): def getDate(self): return Dates.toDashDate(self.date) date = Dates("15-12-2016") dateFromDB = DatesWithSlashes("15/12/2016") if(date.getDate() == dateFromDB.getDate()): print("Equal") else: print("Unequal")
Вихідні дані
Рівний
Тут ми не хотіли б, щоб підклас DatesWithSlashes
замінив метод статичної утиліти, toDashDate
оскільки він має лише одноразове використання, тобто змінити дату на тире.
Ми могли б легко використовувати статичний метод на свою користь, замінивши getDate()
метод у підкласі, щоб він добре працював з DatesWithSlashes
класом.