私有变量和类本地引用

use*_*330 5 python private reference class local

我不是英语母语,我在https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references学习python

在第9.6节“私有变量和类本地引用”中,最后一段指出:

请注意,传递给exec,eval()或execfile()的代码不将调用类的类名视为当前类;这类似于全局语句的效果,该语句的效果同样仅限于字节编译在一起的代码。相同的限制适用于getattr(),setattr()和delattr()以及直接引用dict时

该文本完全一无所获。请解释或给我一些例子来证明这个想法。

Ara*_*Fey 3

想象一下你有一个带有本地引用的类:

class Foo:
    __attr= 5
Run Code Online (Sandbox Code Playgroud)

在类内部,该属性可以被引用为__attr

class Foo:
    __attr= 5
    print(__attr) # prints 5
Run Code Online (Sandbox Code Playgroud)

但不在课堂之外:

print(Foo.__attr) # raises AttributeError
Run Code Online (Sandbox Code Playgroud)

但如果你在类中使用eval, exec, 或 ,情况会有所不同:execfile

class Foo:
    __attr= 5
    
    print(__attr) # prints 5
    exec 'print(__attr)' # raises NameError
Run Code Online (Sandbox Code Playgroud)

您引用的段落对此进行了解释。exec不认为Foo是“当前类”,因此无法引用该属性(除非将其引用为Foo._Foo__attr)。