嵌套在函数和属性查找中的类

时间:2009-08-05 08:11:49

标签: python class nested

以下工作正常,即它不会出现任何错误:

def foo(arg):
    class Nested(object):
        x = arg

foo('hello')

但以下引发了一个例外:

def foo(arg):
    class Nested(object):
        arg = arg # note that names are the same

foo('hello')

回溯:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    foo('hello')
  File "test.py", line 3, in foo
    class Nested(object):
  File "test.py", line 4, in Nested
    arg = arg
NameError: name 'arg' is not defined

我无法理解这种行为的原因。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:5)

arg属性隐藏arg函数参数(内部范围)

def foo(arg):
    class Nested(object):
        arg = arg # you try to read the `arg` property which isn't initialized


如果在解释器窗口中键入i = i而未初始化i变量,则会出现相同的错误。

答案 1 :(得分:3)

如果尝试分配给函数中的变量,Python假定变量是该函数的本地变量。因此,通过尝试将arg分配给自身的值,您隐式将其声明为局部变量。

答案 2 :(得分:3)

这是由于Python的范围规则:

def foo(arg): # (1)
    class Nested(object):
        arg = arg # (2)

(2)在类'命名空间中定义一个新的'arg'名称,它在外部命名空间(1)中显示另一个'arg'的值。

但是,(2)是不必要的,以下内容完全有效:

def foo(arg):
    class Nested(object):
        def message(self):
            print arg
    return Nested()

nested = foo('hello')
nested.message()

(打印hello