Встроенная функция 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
классом.