关于在类里面实例化类外部以“__”开头的类的问题


先来看一段代码


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不会把它加上前缀。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注