Как в Python можно/нужно использовать декораторы для реализации полиморфизма функций?Python

Программы на Python
Anonymous
Как в Python можно/нужно использовать декораторы для реализации полиморфизма функций?

Сообщение Anonymous »

Предположим, у нас есть следующий класс:

Код: Выделить всё

class PersonalChef():
def cook():
print("cooking something...")
И мы хотим, чтобы то, что он готовит, зависело от времени суток, мы могли бы сделать что-то вроде этого:

Код: Выделить всё

class PersonalChef():
def cook(time_of_day):
## a few ways to do this, but this is quite concise:
meal = {'morning':'breakfast', 'midday':'lunch', 'evening':'dinner'}[time_of_day]
print("Cooking", meal)

PersonalChef().cook('morning')
>>> Cooking breakfast
Потенциально хорошей синтаксической формой для этого было бы использование декораторов. Если внутри at_time спрятано какое-то внутреннее оборудование, должно быть возможно заставить его работать следующим образом:

Код: Выделить всё

class PersonalChef():
@at_time('morning')
def cook():
print("Cooking breakfast")

@at_time('midday')
def cook():
print("Cooking lunch")

@at_time('evening')
def cook():
print("Cooking dinner")

PersonalChef().cook('morning')
>>> Cooking breakfast
Причина, по которой эта форма синтаксиса может быть хорошей, проявляется в том, как она затем отображается в подклассах:

Код: Выделить всё

class PersonalChefUK(Personal_Chef):
@at_time('evening')
def cook():
print("Cooking supper")
Код, написанный на уровне подкласса, чрезвычайно минимален и не требует каких-либо знаний о реализации/структурах данных базового класса и не требует каких-либо вызовов super(). чтобы пройти через другие сценарии. Так что это может быть полезно в ситуации, когда большое количество людей пишут производные классы, для которых мы хотим упаковать и скрыть сложность в базовом классе и затруднить им нарушение функциональности.Однако я попробовал несколько разных способов реализовать это и застрял. Однако я новичок в декораторах, поэтому, вероятно, упускаю что-то важное. Есть предложения/комментарии?

Подробнее здесь: https://stackoverflow.com/questions/784 ... lymorphism

Вернуться в «Python»