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

时间:2017-10-21 14:34:17

标签: python c++ constructor

我在Python工作了大约4年,最近开始学习C ++。在C ++中,你为每个类创建一个构造函数方法我想知道这是否正确,认为这相当于Python中的__init__(self)函数?有什么明显的差异吗? C ++析构函数方法与Python _exit__(self)

的问题相同

3 个答案:

答案 0 :(得分:1)

是的,Python的__init__类似于C ++的构造函数。两者通常都是初始化非静态数据成员的地方。在这两种语言中,这些函数将in-creation对象作为第一个参数,显式并按照惯例在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资源保持类型的构造函数和析构函数来完成。例如,在给定互斥锁类型的实例lock的Python中,可以说with lock:引入一个关键部分。在C ++中,我们创建一个不同类型的实例,将锁作为参数std::lock_guard g{lock}来完成同样的事情。 Python __enter____exit__调用映射到C ++ RAII类型的构造函数和析构函数。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

  

我想知道这是否正确   Python中的init(self)函数?

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

有关详细信息,请参阅this__new__实际上是您正在寻找的内容)

  

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

没有。 __exit__仅退出与对象相关的运行时上下文。在这种情况下,您真正​​需要的是__del__

请参阅this,其中明确指出:

  

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