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时。
该文本完全一无所获。请解释或给我一些例子来证明这个想法。
想象一下你有一个带有本地引用的类:
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)。