Предположим, у нас есть следующий класс:
Код: Выделить всё
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