为什么在Python中无法对私有属性使用eval()函数?
问题原因解析
这个问题本质是Python的双下划线名称改写机制和eval的执行特性共同导致的,和eval本身能不能访问私有属性没有直接关联:
- 首先,Python会在编译阶段对类内部所有以双下划线开头、且不以双下划线结尾的标识符做名称改写,改写规则为
_类名__原标识符。你示例代码里__init__方法中的__private符合改写规则,所以代码编译完成后,这个局部变量的实际名称已经被替换为_A__private。你直接写__private + 2的时候,解释器会自动匹配改写后的名称,所以可以正常取值计算。 - 其次,
eval执行的字符串表达式是运行期才会交给解析器处理的,此时不会再触发当前类的名称改写逻辑,eval会直接查找字面量名称__private,而当前作用域里只有改写完成的_A__private,自然就会抛出NameError。
你可以做个简单验证:把eval对应的行改成print(eval('_A__private + 2')),就能正常输出7,完全符合上述逻辑。
内容的提问来源于stack exchange,提问作者Miłosz
相关产品推荐
相关产品推荐

