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

先来看一段代码


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

Windows下用CGI上传二进制文件损坏的解决办法

最近在用Python写CGI程序,在做文件上传这部分时发现上传的文件与原文件不一样,上传的文件都打不开。把上传的文件跟原文件对比发现,原文件里面 0x0d0a 的地方都变成了 0x0a,所以无法打开。这个问题的原因是Python的标准输入流是以文本的方式打开的,对换行符作了处理,下面的代码可以把标准输入流的打开方式设成二进制,把它加进程序开头问题解决。

msvcrt.setmode(0,os.O_BINARY)