繁体   English   中英

类定义中的Python非局部语句

[英]Python nonlocal statement in a class definition

我正在尝试对Python 3源代码中的范围进行一些分析,并且我坚持非局部语句语句如何在类定义中工作。

据我所知,类定义在一个新的命名空间(称为dict)中执行它的主体,并将类名绑定到类型(name,bases,dict)的结果。 非局部x应该起作用,只要它引用一个绑定在非局部范围内某处的变量。

从这里我希望编译和运行以下代码:

class A:
    v = 1
    class B:
        nonlocal v
        v = 2

但这失败了

SyntaxError: no binding for nonlocal 'v' found

而以下代码运行完美

def A():
    v = 1
    class B:
        nonlocal v
        v = 2

任何人都可以解释函数定义的闭包和类定义之间的区别吗?

词法作用域仅适用于函数名称空间,否则在类中定义的方法将能够“看到”类级别属性(这是设计 - 这些属性必须作为方法内的self属性进行访问)。

导致类级别变量被方法引用跳过的相同限制也使nonlocal关键字无法发挥其魔力。 (虽然global确实有效,因为这不依赖于词法范围机制)

Python以不同的方式处理类和函数定义。 例如,您的Av不是A的变量,而是它的属性。 因此,类创建的命名空间不是范围。 我并不感到惊讶的是,当你试图使用它时, nonlocal不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM