作者得出的区别是,就Python语言而言,在输入__init__之前,就有一个指定类型的有效对象。因此,它不是一个“构造函数”,因为在C++和理论上,构造函数将一个无效的、预先构造的对象转换成一个“正确”的完成的对象。在
基本上,在Python中,{{*CD2}}被定义为返回“新对象实例”,而C++新操作符只返回一些内存,而这不是任何类的实例。在
然而,Python中的__init__可能是您首先建立一些重要的类不变量的地方(它有哪些属性,仅供初学者使用)。因此,就您的类的用户而言,它可能是一个构造函数。只是Python运行时不关心这些不变量中的任何一个。如果你愿意的话,它对构造对象的构成标准很低。在
我认为作者的观点是公平的,这无疑是关于Python创建对象的方式的一个有趣的评论。这是一个很好的区别,但是我怀疑调用__init__构造函数是否会导致代码损坏。在
另外,我注意到Python文档将__init__作为构造函数(http://docs.python.org/release/2.5.2/ref/customization.html)在
^{bq}$
。。。因此,如果将__init__看作构造函数有任何实际问题,那么Python就有麻烦了!在
Python和C++构建对象的方式有一些相似之处。两者都调用一个职责相对简单的函数(__new__用于对象实例,而operator new的某个版本用于原始内存),然后两者都调用一个函数,该函数有机会做更多的工作来将对象初始化为有用的状态(__init__而不是构造函数)。在
实际差异包括:>P>在C++中,如果需要,则不需要按适当的顺序自动调用基类的ARG构造函数,而对于Python中的{{CD1>},则必须在自己的^ {{CD1>}中显式地将基项引入其中。即使在C++中,如果有参数,也必须指定基类构造函数。< C++ >中,当构造函数抛出异常时,您有一个完整的机制,就调用已经构建的子对象的析构函数而言。在Python中,我认为运行时(最多)调用__del__。
还有一个区别是__new__不仅仅是分配内存,它必须返回一个实际的对象实例。Python也不是内存的概念。在