Def convert class python статический метод

Содержание
  1. Метод classmethod() и staticmethod в Python
  2. Что такое метод класса?
  3. Пример 1: Создать метод класса с помощью classmethod()
  4. Когда вы использовать метод класса?
  5. 1 Фабричные методы
  6. Пример 2: Создание фабричного метода с использованием метода класса
  7. 2 Правильное создание экземпляра в наследовании
  8. Пример 3: Как метод класса работает для наследования?
  9. Что такое статический метод?
  10. Создание статического метода с помощью staticmethod()
  11. Когда использовать статические методы?
  12. 1. Группирование функции в класс
  13. Создание служебной функции как статического метода
  14. Наличие единой реализации
  15. Как наследование работает со статическим методом?
  16. Статический метод Python
  17. Как создать статический метод в Python
  18. 1. Использование функции staticmethod()
  19. 2. Использование аннотации @staticmethod
  20. Статический метод и метода класса — сравнение
  21. Сравнение статического метода и метода экземпляра
  22. Преимущества

Метод classmethod() и staticmethod в Python

Метод classmethod() возвращает метод класса для данной функции.

classmethod() считается не-Pythonic, поэтому в более новых версиях Python вы можете использовать декоратор @classmethod для определения метода класса.

@classmethod def func(cls, args. )

Метод classmethod() принимает единственный параметр:

И возвращает метод класса для данной функции.

Что такое метод класса?

Метод класса — это метод, который привязан к классу, а не к его объекту. Он не требует создания экземпляра класса, как staticmethod.

Разница между статическим методом и методом класса:

  • Статический метод ничего не знает о классе и имеет дело только с параметрами.
  • Метод класса работает с классом, поскольку его параметром всегда является сам класс.

Метод класса может вызываться как классом, так и его объектом.

Class.classmethod() Or even Class().classmethod()

Но несмотря ни на что, метод класса всегда присоединяется к классу с первым аргументом, поскольку класс cls .

Читайте также:  Php настройка переменных окружения

Пример 1: Создать метод класса с помощью classmethod()

class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()

Здесь у нас есть класс Person с возрастом переменной, присвоенным 25. У нас также есть функция printAge, которая принимает единственный параметр cls, а не self, который мы обычно принимаем. cls принимает в качестве параметра класс Person, а не объект или экземпляр Person.

Теперь мы передаем метод Person.printAge в качестве аргумента методу класса функции. Это преобразует метод в метод класса, так что он принимает первый параметр как класс (т.е. Person).

В последней строке мы вызываем printAge без создания объекта Person, как мы это делаем для статических методов. Это печатает возраст переменной класса.

Когда вы использовать метод класса?

1 Фабричные методы

Фабричные методы — это те методы, которые возвращают объект класса (например, конструктор) для различных вариантов использования.

Это похоже на перегрузку функций в C ++. Поскольку в Python нет ничего как такового, используются методы классов и статические методы.

Пример 2: Создание фабричного метода с использованием метода класса

from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) person = Person('Adam', 19) person.display() person1 = Person.fromBirthYear('John', 1985) person1.display()
Adam's age is: 19 John's age is: 31

Здесь у нас есть два создателя экземпляра класса, конструктор и метод fromBirthYear.

Конструктор принимает обычные параметры name и age. В то время как fromBirthYear принимает класс, имя и год рождения, вычисляет текущий возраст, вычитая его из текущего года, и возвращает экземпляр класса.

Метод fromBirthYear принимает класс Person (а не объект Person) в качестве первого параметра cls и возвращает конструктор путем вызова cls (name, date.today(). Year — BirthYear), что эквивалентно Person (name, date.today() .year — Год рождения)

Перед методом мы видим @classmethod. Это называется декоратором для преобразования fromBirthYear в метод класса как classmethod().

2 Правильное создание экземпляра в наследовании

Всякий раз, когда вы создаете класс из реализации фабричного метода как метода класса, это обеспечивает правильное создание экземпляра производного класса.

Вы можете создать статический метод для приведенного выше примера, но создаваемый им объект всегда будет закодирован как базовый класс.

Но когда вы используете метод класса, он создает правильный экземпляр производного класса.

Пример 3: Как метод класса работает для наследования?

from datetime import date # random Person class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def fromFathersAge(name, fatherAge, fatherPersonAgeDiff): return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff) @classmethod def fromBirthYear(cls, name, birthYear): return cls(name, date.today().year - birthYear) def display(self): print(self.name + "'s age is: " + str(self.age)) class Man(Person): sex = 'Male' man = Man.fromBirthYear('John', 1985) print(isinstance(man, Man)) man1 = Man.fromFathersAge('John', 1965, 20) print(isinstance(man1, Man))

Здесь использование статического метода для создания экземпляра класса требует от нас жесткого кодирования типа экземпляра во время создания.

fromFathersAge возвращает не объект Man, а объект его базового класса Person.

Это нарушает парадигму ООП. Использование метода класса от fromBirthYear может гарантировать ООП-кодирование кода, поскольку он принимает первый параметр как сам класс и вызывает его фабричный метод.

Встроенная функция staticmethod() возвращает статический метод для данной функции.

В более новых версиях Python вы можете использовать декоратор @staticmethod.

@staticmethod def func(args, . )

Метод staticmethod() принимает единственный параметр:

Staticmethod() возвращает статический метод для функции, переданной в качестве параметра.

Что такое статический метод?

Статические методы, как и методы класса, — это методы, привязанные к классу, а не к его объекту. Они не требуют создания экземпляра класса. Они не зависят от состояния объекта.

Разница между статическим методом и методом класса:

  • Статический метод ничего не знает о классе и имеет дело только с параметрами.
  • Метод класса работает с классом, поскольку его параметром всегда является сам класс.

Их может вызывать как класс, так и его объект.

Class.staticmethodFunc() or even Class().staticmethodFunc()

Создание статического метода с помощью 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))

Когда использовать статические методы?

1. Группирование функции в класс

Статические методы имеют ограниченный вариант использования, потому что, как методы класса или любые другие методы внутри класса, они не могут получить доступ к свойствам самого класса.

Однако, когда вам нужна служебная функция, которая не имеет доступа к каким-либо свойствам класса, но имеет смысл, что она принадлежит этому классу, мы используем статические функции.

Создание служебной функции как статического метода

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.

Это статический метод, потому что он не требует доступа к каким-либо свойствам самой даты, а требует только параметров.

Мы также можем создать 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")

Здесь мы не хотели бы, чтобы подкласс DatesWithSlashes переопределял статический служебный метод toDashDate, потому что он используется только один раз, то есть меняет дату на тире-даты.

Мы могли бы легко использовать статический метод в наших интересах, переопределив метод getDate() в подклассе, чтобы он хорошо работал с классом DatesWithSlashes.

Источник

Статический метод Python

Статические методы позволяют разделить служебные методы на отдельные подмодули.

Допустим, у нас есть модуль Python для служебных методов для строк, списков и кортежей.

Мы можем создавать статические методы в отдельных классах для лучшего понимания и простоты использования.

class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass

Если нам нужно перевернуть список, мы ListUtils.reverse() метод ListUtils.reverse() . Если нам нужно перетасовать элементы кортежа, мы TupleUtils.shuffle() статический метод TupleUtils.shuffle() .

Как создать статический метод в Python

1. Использование функции staticmethod()

Staticmethod() полезен, когда вы хотите создать статический метод, определенный в классе. Обратите внимание, что у метода не должно быть аргумента self.

class StringUtils: def to_uppercase(s): return str(s).upper() StringUtils.upper = staticmethod(StringUtils.to_uppercase) print(StringUtils.upper('Python')) # PYTHON

Если мы попытаемся вызвать метод to_uppercase() из объекта StringUtils, он вызовет ошибку, поскольку «метод принимает 1 позиционный аргумент, но было дано 2».

su = StringUtils() try: print(su.to_uppercase('Python')) except TypeError as te: print(te) # Output # to_uppercase() takes 1 positional argument but 2 were given

Однако мы можем вызвать метод to_uppercase() из ссылки на класс.

print(StringUtils.to_uppercase('Python')) # PYTHON

пример статического метода

2. Использование аннотации @staticmethod

Это рекомендуемый способ создания статического метода. Нам просто нужно аннотировать метод декоратором @staticmethod.

class MathUtils: @staticmethod def multiply(a, b): return a * b print(MathUtils.multiply(10, 5)) # 50

Staticmethod Декоратор Аннотация

Статический метод и метода класса — сравнение

  • Метод класса Python может получить доступ к переменным класса, но статический метод не может получить доступ к переменным класса.
  • Метод класса требует, чтобы первый формальный параметр был привязан к классу. Статический метод может присутствовать без каких-либо параметров.
  • Мы используем @classmethod для создания методов класса. Мы используем @staticmethod для создания статических методов.
class Test: x = 10 @classmethod def foo(cls): print(cls.x) @staticmethod def bar(): # Unresolved reference error for class variable x # print(x) pass

Сравнение статического метода и метода экземпляра

  • Метод экземпляра в классе может обращаться как к переменным экземпляра, так и к переменным класса. Статический не может получить доступ к переменным класса или переменным экземпляра.
  • Нам нужна «собственная переменная» в качестве формального параметра для метода экземпляра. В статическом такого ограничения нет.
  • Мы используем декоратор @staticmethod. Нам не нужны декораторы для создания функции экземпляра.
class Test: x = 10 def func(self): print(type(self)) print(self.x)

Преимущества

Статические методы полезны для группировки служебных методов внутри границ класса. В остальном это просто обычная функция в скрипте Python.

Источник

Оцените статью