Python __init__ 与 C++ 构造函数相比

问题描述 投票:0回答:3

我使用 Python 已经有一段时间了,最近开始学习 C++。在 C++ 中,你为每个类创建一个构造函数方法,我想知道这是否相当于 Python 中的

__init__(self)
函数?有什么显着的差异吗? C++ 析构函数方法与 Python 的相同问题
_exit__(self)

python c++ constructor
3个回答
2
投票

是的,Python 的

__init__
类似于 C++ 的构造函数。两者通常都是非静态数据成员初始化的地方。在这两种语言中,这些函数都将创建对象作为第一个参数,在 Python 中显式且按照约定命名为
self
,在 C++ 中隐式并按照命名为
this
的语言。在这两种语言中,这些函数都不能返回任何内容。两种语言之间的一个显着区别是,在 Python 中,基类
__init__
必须从继承类
__init__
显式调用,而在 C++ 中,它是隐式且自动的。 C++ 还可以通过成员初始值设定项列表和非静态数据成员初始值设定项在构造函数主体之外声明数据成员初始值设定项。在某些情况下,C++ 还会为您生成默认构造函数。

Python 的

__new__
类似于 C++ 的类级别
operator new
。两者都是静态类函数,必须返回一个值才能继续创建。在 C++ 中,该东西是指向内存的指针,而在 Python 中,它是正在创建的类类型的未初始化值。

Python 的

__del__
在 C++ 中没有直接的类似物。它是一个对象终结器,也存在于其他垃圾收集语言(如 Java)中。它不会在词法上预先确定的时间调用,但运行时会在释放对象时调用它。

__exit__
的作用类似于 C++ 的析构函数,因为它可以提供确定性清理和词法预定点。在 C++ 中,这往往通过 RAII 类型的 C++ 析构函数来完成。在 Python 中,同一个对象可以多次调用
__enter__
__exit__
。在 C++ 中,这可以通过单独的 RAII 资源持有类型的构造函数和析构函数来完成。例如,在 Python 中,给定互斥锁类型的实例
lock
,可以说
with lock:
来引入临界区。在 C++ 中,我们创建一个不同类型的实例,将锁作为参数
std::lock_guard g{lock}
来完成同样的事情。 Python
__enter__
__exit__
调用映射到 C++ RAII 类型的构造函数和析构函数。


1
投票

您可以说的最好的说法是,

__init__
和 C++ 构造函数在新对象的生命周期中大致相同的时间点被调用,并且
__del__
和 C++ 析构函数也在接近对象生命周期结束时被调用。目的。然而,语义明显不同,并且每种语言的执行模型使得进一步比较变得更加困难。

可以说,

__init__
用于在创建对象后初始化对象。 __del__
 是一个析构函数,可能在对对象的最后一个引用消失后的某个未指定的时间点被调用,而 __exit__
 更像是在 
with
 语句末尾调用的回调,无论对象的引用计数是否达到零。


0
投票

我想知道这等同于是否正确 Python 中的 init(self)

 函数?

不。只要看一下语句的结构就可以理解。事实上,

self

是对实例的引用。因此,必须在调用 
__init__
 之前构造实例。 

请参阅

this了解更多信息(__new__

实际上就是您正在寻找的内容)

C++ 析构函数方法与 Python 的相同问题_exit__(self)


不。

__exit__

 仅退出与该对象相关的运行时上下文。在这种情况下,您真正要寻找的是
__del__

参见

this,其中明确指出:

当实例即将被销毁时调用。这也称为 析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.