Zek*_*eke 14 c++ python constructor
我最近一直在学习更多关于Python的知识,并且当我通过优秀的Dive进入Python时,作者在这里指出该__init__方法在技术上不是构造函数,即使它通常像一个函数.
我有两个问题:
C++如何构造对象和Python如何"构造"对象之间有什么区别?
什么使构造函数成为构造函数,以及该__init__方法如何不符合此条件?
Ste*_*sop 15
作者的区别在于,就Python语言而言,在您输入之前,您拥有指定类型的有效对象__init__.因此,它不是"构造函数",因为在C++中,理论上,构造函数将无效的预构造对象转换为该类型的"正确"完成对象.
基本上__new__在Python中定义为返回"新对象实例",而C++新运算符只返回一些内存,这还不是任何类的实例.
但是,__init__在Python中,您可能首先要建立一些重要的类不变量(它具有哪些属性,仅适用于初学者).因此,就您的类的用户而言,它可能也是一个构造函数.只是Python运行时不关心任何这些不变量.如果您愿意,它对构造对象的构成标准非常低.
我认为作者提出了一个公平的观点,这对于Python创建对象的方式肯定是一个有趣的评论.这是一个相当不错的区别,但我怀疑调用__init__构造函数会导致代码损坏.
另外,我注意到Python文档是指__init__构造函数(http://docs.python.org/release/2.5.2/ref/customization.html)
作为构造函数的特殊约束,不能返回任何值
...所以如果__init__作为构造函数思考有任何实际问题,那么Python就遇到了麻烦!
Python和C++构造对象的方式有一些相似之处.两者都调用具有相对简单职责的函数(__new__对于对象实例与operator new原始内存的某个版本),然后两者都调用一个函数,该函数有机会将对象初始化为有用状态(__init__对于构造函数).
实际差异包括:
在C++中,如果需要,可以按适当的顺序自动调用基类的no-arg构造函数,而__init__在Python中,必须在自己的基础上显式地初始化基数__init__.即使在C++中,如果它有参数,也必须指定基类构造函数.
在C++中,你有一个完整的机制,可以解释构造函数抛出异常时发生的事情,就调用已构造的子对象的析构函数而言.在Python中,我认为运行时(最多)调用__del__.
此外,还有也是差别__new__不只是分配内存,它必须返回一个实际的对象实例.然后,原始内存实际上并不是适用于Python代码的概念.