先来看一段代码
class Test1:
def __init__(self):
print(__Test2())
class __Test2:
pass
if __name__ == '__main__':
Test1()
这段代码的本意是在“Test1”的构造方法里实例化一个“Test2”,但是当你执行这段代码的时候,Python会提示你“NameError: name ‘_Test1__Test2’ is not defined”。明明实例化的是__Test2为什么会提示“_Test1__Test2”找不到呢?原来在Python里面以“”开头成员是私有成员,Python会采取一些措施阻止这些成员被类外部的代码访问。Python阻止私有成员被类外部的代码访问的方法是十分粗暴的,它的做法是不管你的代码是在定义或访问成员,还是在定义或访问局部变量,甚至在调用其他类的成员,只要在类内部出现以“__”开头并且不以“_”结尾的标识符都会加上一个特定的前缀。因此上面的代码实例化“__Test2”时显然被Python当成了访问私有成员而加上了个前缀,自然就找不到了。既然知道原因就容易解决了,把上面代码实例化“__Test2”的代码换成“eval(“__Test2()”)”就可以了,因为这时“__Test2”是以字符串而不是标识符出现的,所以Python不会把它加上前缀。
发表回复