Python __init__与C++构造函数的比较

Python __init__ Compared to C++ Constructor

本文关键字:比较 构造函数 init Python C++      更新时间:2023-10-16

我已经使用Python大约4年了,最近开始学习C++。在C++中,您为每个类创建一个构造函数方法。我想知道,认为这等效于Python中的__init__(self)函数是否正确?有什么显著的区别吗?C++析构函数方法与Python_exit__(self)的问题相同

是的,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类型的构造函数和析构函数。

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

只要说__init__用于在对象创建后初始化就足够了。__del__类似于一个析构函数,在对对象的最后一次引用消失后,可能会在某个未指定的时间点被调用,而__exit__更像是在with语句结束时调用的回调,无论对象的引用计数是否为零。

我想知道认为这等效于Python中的init(self)函数

否。只要看一下陈述的结构,你就能理解。实际上,self是对该实例的引用。因此,必须在调用__init__之前构造实例。

有关更多信息,请参阅此(__new__实际上是您想要的)

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

否。__exit__仅退出与该对象相关的Runtime上下文。在这种情况下,您真正想要的是__del__

看到这个,它清楚地说明:

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

相关文章: