为什么不能在私有变量中使用eval()函数?

3

我想知道为什么私有属性不能使用eval()函数。

class A:
    def __init__(self):
        __private = 5
        print(__private + 2)  # Prints '7'
        print(eval('__private + 2'))  # NameError: name '__private' is not defined

A()

1
不要使用双下划线作为前缀。 - Passerby
3
有趣。因此,“私有”变量会与类名进行名称混淆(doc)。print(eval('_A__private + 2')) 看起来有效。但 __private 不是类级别的变量,是吗? - 001
1
@JohnnyMopp,文档说“不考虑标识符的语法位置,只要它出现在类的定义中”,所以它被搞乱了。看起来eval有一个单独的范围或类似的东西。 - VPfB
1个回答

2
与名称混淆有关,请参阅文档:documentation
注意,传递给 exec() 或 eval() 的代码不认为调用类的类名是当前类;这类似于 global 语句的影响,其影响也仅限于一起编译的代码。对 getattr()、setattr() 和 delattr() 的引用以及直接引用 __dict__ 时也适用相同的限制。
因此,要在 eval() 中正确使用私有变量,必须以混淆的形式传递,例如 print(eval('_A__private + 2'))。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接