Функція staticmethod() повертає статичний метод для цієї функції.
Наприклад:
|
1 2 3 4 5 6 7 8 9 10 |
class Calculator: def add_numbers(num1, num2): return num1 + num2 # Конвертуємо метод add_numbers() у статичний метод Calculator.add_numbers = staticmethod(Calculator.add_numbers) sum = Calculator.add_numbers(5, 7) print('Sum:', sum) |
Результат:
Sum: 12
Синтаксис функції staticmethod()
|
1 |
staticmethod(function) |
Примітка: У нових версіях Python ви можете використати декоратор @staticmethod замість цієї функції.
Синтаксис @staticmethod наступний:
|
1 2 |
@staticmethod def func(args, ...) |
Параметри функції staticmethod()
Функція staticmethod() приймає один параметр:
function — функція, яку необхідно перетворити в статичний метод.
Значення, яке повертає функція staticmethod()
Функція staticmethod() повертає статичний метод для функції, яка передана в якості аргументу.
Що таке статичний метод?
Статичні методи, як і методи класу — це методи, які прив’язані до класу, а не до його об’єкта. Вони не потребують створення об’єкта класу. Таким чином вони не залежать від стану об’єкта.
Різниця між статичним методом та методом класу полягає в наступному:
статичні методи нічого не знають про клас і працюють лише з параметрами;
метод класу працює із класом, оскільки його параметром завжди є сам клас.
Вони можуть бути спричинені як самим класом, так і його об’єктом:
|
1 |
Class.staticmethodFunc() |
або
|
1 |
Class().staticmethodFunc() |
Приклад №1: Створення статичного методу за допомогою функції staticmethod()
|
1 2 3 4 5 6 7 8 9 |
class Mathematics: def addNumbers(x, y): return x + y # Створюємо статичний метод addNumbers() Mathematics.addNumbers = staticmethod(Mathematics.addNumbers) print('The sum is:', Mathematics.addNumbers(5, 10)) |
Результат:
The sum is: 15
Коли слід використовувати статичні методи?
1. Допоміжна функція для класу
Статичні методи мають обмежений варіант використання, оскільки, як і методи класу або будь-які інші методи всередині класу, вони не можуть отримати доступ до властивостей самого класу.
Однак, коли потрібна допоміжна функція, яка не звертається до жодних властивостей класу, але потрібна її приналежність до класу, слід використовувати статичні методи.
Приклад №2: Створення допоміжної функції в якості статичного методу
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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") |
Результат:
Equal
Тут у нас є клас Dates, який працює лише з датами з тире. Проте в нашій попередній базі даних всі дати були розділені скісною рискою. Щоб перетворити дати зі скісною рискою на дати з тире, ми створили допоміжний метод toDashDate() в межах класу Dates.
Це статичний метод, тому що йому не потрібно мати доступ до будь-яких властивостей класу Dates, а потрібні лише параметри. Ми можемо також створити метод toDashDate() поза класом, але оскільки він працює тільки з датами, логічно зберігати його всередині класу Dates.
2. Наявність єдиної реалізації
Статичні методи використовуються, коли ми не хочемо, щоб дочірні класи змінювали/перевизначали конкретну реалізацію методу батьківського класу.
Приклад №3: Як працює спадкування зі статичним методом?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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") |
Результат:
Equal
Тут ми не хочемо, щоб дочірній клас DatesWithSlashes перевизначав статичний допоміжний метод toDashDate() батьківського класу Dates.
