考虑这个简单的装饰演示:
class DecoratorDemo():
def _decorator(f):
def w( self ) :
print( "now decorated")
f( self )
return w
@_decorator
def bar( self ) :
print ("the mundane")
d = DecoratorDemo()
d.bar()
运行它会得到预期的输出:
now decorated
the mundane
如果我将以下两行添加到上述代码的末尾,则d.bar
和d._decorator
的类型会确认为<class 'method'>
。
print(type(d.bar))
print(type(d._decorator))
现在,如果我在定义bar
方法之前修改上面的代码来定义_decorator
方法,我会收到错误
@_decorator
NameError: name '_decorator' is not defined
为什么方法的顺序与上述情况相关?
答案 0 :(得分:4)
因为装饰方法实际上并不是一种方法声明&#39;看起来像。装饰器语法suger隐藏的是:
def bar( self ) :
print ("the mundane")
bar = _decorator(bar)
如果您将这些行放在_decorator
的定义之前,则名称错误并不令人惊讶。就像@Daniel Roseman所说,类体只是代码,从上到下执行。