对于Python 3.6.0中的类内部方法的非局部

时间:2017-02-26 20:13:55

标签: python python-3.x

我搜索了这个,但找不到任何东西。在Python documentation 9.2.1中,使用函数scope_test()给出了一个示例。

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

当我将其更改为class并运行它时,我得到:

SyntaxError: no binding for nonlocal 'spam' found

我认为'nonlocal'对于类中的方法不起作用,但它只能找到函数内部的函数。我在网上找到的所有答案都是针对功能而不是课程。

  • 为什么非本地不适用于课程?
  • 有办法吗?

2 个答案:

答案 0 :(得分:1)

nonlocal当然适用于类中的方法,你只需要将函数嵌套在一个方法中(我在这里使用static方法):

class Foo:
    @staticmethod
    def scope_test():
        def do_local():
            spam = "local spam"

        def do_nonlocal():
            nonlocal spam
            spam = "nonlocal spam"

        def do_global():
            global spam
            spam = "global spam"

        spam = "test spam"
        do_local()
        print("After local assignment:", spam)
        do_nonlocal()
        print("After nonlocal assignment:", spam)
        do_global()
        print("After global assignment:", spam)

Foo.scope_test()
print("In global scope:", spam)

使scope_test成为一个类并不会引入nonlocal工作所需的嵌套。你还需要嵌套。

答案 1 :(得分:1)

在该示例中显示的词法作用域仅适用于函数名称空间。想象一下,如果这是在一个类中工作 - 那么所有类方法都能够直接访问类属性,而不是通过self参数或类名实际工作。

换句话说,类的命名空间不会为类中的方法引入封闭范围,这也会阻止nonlocal查找类体级绑定。