Python decorators just syntactic sugar?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Understanding Python decorators
我对使用Python装饰器非常陌生,而且从我第一印象中了解到它们只是语法上的糖分。
在更复杂的应用中是否有更深入的应用?
是的,这是句法上的糖分。没有它们,一切都可以实现,但需要更多的代码行。但它可以帮助您编写更简洁的代码。
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | from functools import wraps def requires_foo(func): @wraps(func) def wrapped(self, *args, **kwargs): if not hasattr(self, 'foo') or not self.foo is True: raise Exception('You must have foo and be True!!') return func(self, *args, **kwargs) return wrapped def requires_bar(func): @wraps(func) def wrapped(self, *args, **kwargs): if not hasattr(self, 'bar') or not self.bar is True: raise Exception('You must have bar and be True!!') return func(self, *args, **kwargs) return wrapped class FooBar(object): @requires_foo # Make sure the requirement is met. def do_something_to_foo(self): pass |
我们也可以把装饰物串在一起。
1 2 3 4 5 | class FooBar(object): @requires_bar @requires_foo # You can chain as many decorators as you want def do_something_to_foo_and_bar(self): pass |
好吧,我们最终可能会有很多的装饰师在一起。
我知道!我会写一个适用于其他装修师的装修师。
所以我们可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def enforce(requirements): def wrapper(func): @wraps(func) def wrapped(self, *args, **kwargs): return func(self, *args, **kwargs) while requirements: func = requirements.pop()(func) return wrapped return wrapper class FooBar(object): @enforce([reguires_foo, requires_bar]) def do_something_to_foo_and_bar(self): pass |
这是一个小样本,只是用来玩。
我非常喜欢decorator语法,因为它使代码更加显式
例如,在Django中,有一个登录名"Required decorator:https://docs.djangoproject.com/en/dev/topics/auth/django.contrib.auth.decorator s.login"是必需的。
要为一个函数/视图注入@login_所需的行为,您所要做的就是将修饰器附加到它上(而不是放置if:)。其他:…控制表达式无处不在等)
阅读PEP!
http://www.python.org/dev/peps/pep-0318/
它有关于语言决策的历史,以及为什么