English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Внутренняя функцияstaticmethod() возвращает статический метод для заданной функции.
Синтаксисstaticmethod():
staticmethod(function)
Использованиеstaticmethod() считается нестандартным способом создания статических функций в Python.
Таким образом, в более новых версиях Python вы можете использовать декоратор@staticmethod.
Синтаксис@staticmethod:
staticmethod def func(args, ...)
staticmethod() принимает один параметр:
функция - функция, которую нужно преобразовать в статическую
staticmethod() возвращает статический метод для переданной функции.
Статические методы сКлассовые методыОни очень похожи, так как это методы, привязанные к классу, а не к объекту.
они не требуют создания экземпляра класса. Таким образом, они не зависят от состояния объекта.
Разница между статическими и классовыми методами:
Статические методы не знают о классе, они обрабатывают только параметры.
Классовые методы используются вместе с классом, так как их параметр всегда сам класс.
их можно вызывать как через класс, так и через объекты.
Class.staticmethodFunc() или даже Class().staticmethodFunc()
class Mathematics: def addNumbers(x, y): return x + y # Создание статического метода addNumbers Mathematics.addNumbers = staticmethod(Mathematics.addNumbers) print('Общее количество:', Mathematics.addNumbers(5, 10))
Результат вывода
Общее количество: 15
Статические методы имеют ограничения в использовании, так как, как и любые другие методы в классе, статические методы не могут доступ к свойствам класса.
Но когда вам нужна утилитарная функция, которая не доступна к любым свойствам класса, но знает, что она принадлежит этому классу, мы используем статические функции.
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.
Когда мы не хотим, чтобы подкласс изменял или переопределял специфическое реализацию метода, мы можем использовать статические методы.
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, так как у нее есть только одно использование - изменить date на dash-date.
С помощью перезаписи метода getDate() в подклассе мы можем легко использовать статические методы, чтобы использовать свои преимущества и работать вместе с классом DatesWithSlashes.