Python __init__与C++构造函数的比较
Python __init__ Compared to C++ Constructor
我已经使用Python大约4年了,最近开始学习C++。在C++中,您为每个类创建一个构造函数方法。我想知道,认为这等效于Python中的__init__(self)
函数是否正确?有什么显著的区别吗?C++析构函数方法与Python_exit__(self)
的问题相同
__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__
。
看到这个,它清楚地说明:
在实例即将被销毁时调用。这也被称为析构函数。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 没有默认构造函数作为模板参数的自定义比较器
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 通过构造函数与直接初始化进行成员初始化的比较
- 如何使用特定构造函数使用STL Priority_queue 比较器
- Python __init__与C++构造函数的比较
- 如何用类别的consumetrized构造函数声明使用类的比较对象设置的STL设置
- C 构造函数与初始化列表速度比较
- 比较迭代器value_type范围构造函数
- 无法弄清楚为什么使用重载比较运算符在执行前调用复制构造函数
- 使用构造函数来比较/计算用户输入
- Clang和GCC与MSVC和ICC的比较:如果复制/移动省略也适用,那么在复制/移动构造函数中是否需要静态断言
- 映射比较构造函数参数
- 当我只对比较部分值感兴趣而不能假设另一部分的默认构造函数时,如何使用 std::lower_bound
- 比较两个map::迭代器:为什么需要std::pair的复制构造函数