В чем разница между использованием декораторов и расширением подкласса по наследству? - PullRequest
3 голосов
/ 19 ноября 2010

Я пытался обернуть свой мозг вокруг Decorators в python, но не могу понять, почему мы не можем добиться того же с помощью подклассов?

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

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

Что синтаксис dooes формализовать шаблон, который уже использовали многие люди, и сделать его стандартным синтаксисом, который имеет имя и рекомендации по использованию. Вам не обязательно использовать декораторы - вы можете добиться того же эффекта другими способами - но использование официально поддерживаемого стандартного подхода с кратким, легким для чтения синтаксисом делает жизнь немного проще.

1 голос
/ 20 ноября 2010
  1. Вы знаете, что добавление определения с помощью @spam class|def name просто означает «определить имя, как здесь написано, затем связать name с spam(name)»?

  2. Декораторы очень часто применяются к функциям, а не к классам.Конечно, вы можете создать вызываемый класс и подкласс, который ... вы также можете реализовать свой собственный целочисленный тип.Ни один из них не является жизнеспособным.

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

Как указывает Роберт в комментарии, если бы у вас был пример, ответы могли бы быть более конкретными...

...