python中的构造函数和初始化程序有啥区别? [复制]

Posted

技术标签:

【中文标题】python中的构造函数和初始化程序有啥区别? [复制]【英文标题】:What is the difference between a constructer and initializer in python? [duplicate]python中的构造函数和初始化程序有什么区别? [复制] 【发布时间】:2011-09-02 02:31:32 【问题描述】:

可能重复:Python (and Python C API): new versus init

我刚刚上大学,讲师交替使用构造函数和初始化程序这两个术语。我很确定这是错误的。

我尝试在谷歌上搜索答案,但没有找到我正在寻找的答案。

【问题讨论】:

我认为有人在关闭时错过了“完全重复”按钮,而是点击“离题”....:) 【参考方案1】:

在大多数 OO 语言中,它们是相同的步骤,所以他对 java、c++ 等的东西没有错。在 python 中,它们分两步完成:__new__ 是构造函数; __init__ 是初始化器。

Here 是另一个更详细地了解它们之间差异的答案。

【讨论】:

我见过的关于这个主题的最佳答案。【参考方案2】:

在几乎所有常见的情况下,Python 没有其他 OO 语言所使用的构造函数,因为通常不鼓励手动管理内存。相反,您通常应该做的是在类上定义一个 __init__ 方法。调用此方法以自动初始化新的实例对象,这是构造后的第一件事。因此,它并不是真正的构造函数,并且将其作为构造函数来谈论它可能会使某些人感到困惑。

当然,有些人想称它为构造函数,因为它的使用有点像构造函数 - 基本上,只要每个人都理解你实际指的是什么,你就可以随意调用它。但总的来说,为了明确并让自己理解,将其称为 init 方法或构造函数以外的其他东西。从根本上说,不同的语言只是有一些不同的术语,而且说得非常清楚总是需要根据你的主题和听众进行调整。

在 Python 中,可以以更精细的粒度管理实例的创建和销毁,但除非您知道自己在做什么,否则您不会想要这样做。这是通过定义 __new____del__ 方法来挂钩对象实例化和 del 语句来完成的。这些是否完全符合构造函数和析构函数的条件还有待商榷(Python 文档将 del 方法称为析构函数,但对于构​​造函数的构成往往含糊不清,例如,包括许多返回对象实例的函数)。我仍然鼓励您使用手头语言的特定术语,并在比较讨论中预先定义您的术语。与往常一样,您在演讲时对术语的选择涉及在听众能够轻松跟随您和可能导致听众混淆之间的权衡:如果您谈论的是内存管理,可能会尽可能具体,但如果您谈论的是松散的,那么只需使用您的听众理解的一些词并准备好澄清。

你的老师最不清楚,我不知道这些术语的任何一个规范定义,但它们可能会让那些从其他语言学习非常具体的定义的人感到困惑。

【讨论】:

【参考方案3】:

http://docs.python.org/reference/datamodel.html#basic-customization

__new__ - 构造函数。

__init__ - 初始化器。

【讨论】:

-1 您链接到的那个页面将__init__ 描述为构造函数,同时引用__init____new__ 接收传递给构造函数表达式的参数.它没有提到“初始化器”这个词。

以上是关于python中的构造函数和初始化程序有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++中new出得对象与C中的malloc出得有啥联系和区别?

Java的静态块和初始化块分别何时执行?有啥区别?

Flutter 中的 initState 和类构造函数有啥区别?

java中构造方法和方法有啥区别

C#里类型初始化器和构造方法有啥区别 他们分别在啥情况下用?

c++中,析构函数和delete各有啥作用啊