Декораторы - это простой синтаксис для определенного способа вызова функций более высокого порядка, поэтому, если вы сосредоточены только на синтаксисе, вряд ли будет большая разница. IOW, где вы можете сказать
@mydecorator
def f(...):
# body of f
Вы могли бы сказать то же самое
def f(...):
# body of f
f = mydecorator(f)
Преимущество синтаксиса декоратора состоит в том, что он немного более лаконичен (без повторения f
три раза ;-) и что он приходит до def
(или class
, для декораторов классов) ), тем самым немедленно предупреждая читателя о коде. Это важно, но просто не может быть замечательно !
Семантика декораторов (и, что то же самое, вызовов функций высшего порядка, соответствующих этому шаблону, если декораторов не было ;-). Например,
@classmethod
def f(cls, ...):
позволяет создавать методы класса (особенно полезно для альтернативных конструкторов), а
@property
def foo(self, ...):
позволяет вам создавать свойства только для чтения (с другими связанными декораторами в 2.6 для свойств не только для чтения ;-), которые чрезвычайно полезны, даже когда не используется (так как они спасают вас от записи партии глупых «шаблонных» аксессоров для того, что по сути является атрибутами ... просто потому, что доступ к атрибуту может потребовать запуска некоторых вычислений в будущем! -).
Помимо тех, что встроены в Python, ваши собственные декораторы могут быть такими же важными - конечно, в зависимости от того, чем является ваше приложение. В общем, они упрощают рефакторинг некоторой части кода (которая в противном случае должна была бы дублироваться во многих функциях и классах [[или вам, возможно, придется прибегнуть к метаклассам для случая класса, но они более богаты и сложны для используйте правильно]]) в декоратор. Таким образом, они помогают вам избежать повторяющегося, стандартного кода - и поскольку DRY , «Не повторяйте себя», является основным принципом разработки программного обеспечения, любая помощь, которую вы можете получить в этом направлении, должна быть от всей души приветствоваться.