c++ - Python 和 C++ 构造函数之间的差异

标签 c++ python constructor

我最近一直在学习更多关于 Python 的知识,并且正在学习优秀的 Dive into Python作者指出here __init__ 方法在技术上并不是一个构造函数,尽管它通常像构造函数一样工作。

我有两个问题:

  1. 怎么做有什么区别 C++ 构造一个对象以及如何 Python“构造”一个​​对象?

  2. 什么 使构造函数成为构造函数, 以及 __init__ 方法如何 不符合这个标准?

最佳答案

作者得出的区别在于,就 Python 语言而言,在您输入 __init__ 之前,您有一个指定类型的有效对象。因此,它不是“构造函数”,因为在 C++ 中,理论上,构造函数将无效的、预先构造的对象转换为“正确”的已完成类型对象。

基本上,Python 中的 __new__ 被定义为返回“新对象实例”,而 C++ 的 new 运算符只是返回一些内存,这还不是任何类的实例。

但是,Python 中的 __init__ 可能是您首先建立一些重要的类不变量的地方(它具有哪些属性,仅作为初学者)。因此,就您的类的用户而言,它也可能是一个构造函数。只是 Python 运行时并不关心这些不变量中的任何一个。如果您愿意,它对构成构造对象的标准非常低。

我认为作者提出了一个公平的观点,这对于 Python 创建对象的方式来说无疑是一个有趣的评论。不过,这是一个很好的区别,我怀疑调用 __init__ 构造函数会导致代码损坏。

另外,我注意到 Python 文档将 __init__ 称为构造函数 (http://docs.python.org/release/2.5.2/ref/customization.html)

As a special constraint on constructors, no value may be returned

...所以如果将 __init__ 视为构造函数有任何实际问题,那么 Python 就有麻烦了!

Python 和 C++ 构造对象的方式有一些相似之处。两者都调用具有相对简单职责的函数(__new__ 用于对象实例,而某些版本的 operator new 用于原始内存),然后都调用有机会做更多的工作来将对象初始化为有用的状态(__init__ 与构造函数)。

实际差异包括:

  • 在 C++ 中,基类的无参数构造函数会在必要时以适当的顺序自动调用,而对于 Python 中的 __init__,您必须在自己的 __init__。即使在 C++ 中,如果基类构造函数有参数,您也必须指定它。

  • 在 C++ 中,当构造函数抛出异常时,您有一个完整的机制,即为已构造的子对象调用析构函数。在 Python 中,我认为运行时(最多)调用 __del__.

还有一点不同,__new__只是分配内存,它必须返回一个实际的对象实例。再说一次,原始内存并不是真正适用于 Python 代码的概念。

关于c++ - Python 和 C++ 构造函数之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4025913/

相关文章:

c++ - 用于二进制输出的 ostream_iterator

c++ - "Packing"结构对性能有何影响

c++ - Boost rng vs OpenCV rng vs c++11 std::random?

java - 类的构造函数中有问题

运行程序时出现java.lang.NullPointerException

c++ - DEBUG 语句的作用是什么?

python - Django 测试和中间件

python - Sentence.split 获取网站页面

python - BeautifulSoup 网页抓取多个页面 URL 不会改变

java - new int[]{} 与 {} 之间的区别