我使用 Python 已经有一段时间了,最近开始学习 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
语句末尾调用的回调,无论对象的引用计数是否达到零。