首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰器NameError

装饰器NameError
EN

Stack Overflow用户
提问于 2015-08-19 13:20:09
回答 1查看 4.3K关注 0票数 3

考虑一下这个简单的装饰演示:

代码语言:javascript
复制
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()

运行这将给出预期的输出:

代码语言:javascript
复制
now decorated
the mundane

如果我将以下两行添加到上述代码的末尾,则d.bard._decorator的类型确认为<class 'method'>

代码语言:javascript
复制
print(type(d.bar))
print(type(d._decorator))

现在,如果在定义bar方法之前修改上述代码以定义_decorator方法,则会得到错误。

代码语言:javascript
复制
     @_decorator
NameError: name '_decorator' is not defined

为什么在上述情况下,方法的排序是相关的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 15:32:01

因为修饰的方法实际上不是看起来的“方法声明”。修饰器语法suger隐藏的内容如下:

代码语言:javascript
复制
def bar( self ) :
    print ("the mundane")
bar = _decorator(bar)

如果将这些行放在_decorator定义之前,名称错误并不令人惊讶。就像丹尼尔·罗斯曼说的那样,类主体只是代码,它是从上到下执行的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32096706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档