2011-05-25 43 views

回答

19

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

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

+0

在这个问题上我见过最好的答案。 – user2372074 2014-10-02 18:22:43

0

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

__new__ - 构造。

__init__ - 初始值设定项。

+1

-1您链接的那个页面将'__init__'描述为构造函数,同时引用'__init__'和'__new__'接收传递给**构造函数表达式**的参数。它没有提到“初始化程序”这个词。 – Ben 2011-11-08 00:12:32

5

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

当然,有些人会称它为构造函数,因为它有点像构造函数 - 只要每个人都明白你实际上指的是什么,从根本上说,你可以随心所欲地调用它。但总的来说,要明确并让自己明白,可以将其称为init方法或非构造函数。从根本上说,不同的语言只是以不同的术语出现,而且讲得非常清楚,总是需要对主题和观众进行调整。

在Python中,可以以更细的粒度管理实例创建和销毁,尽管除非知道自己在做什么,否则不会想要。这是通过定义__ ____ 德尔 __方法挂钩对象实例化和德尔语句来完成。究竟这些是否构成构造函数和析构函数更具争议性(Python文档称del构造函数为析构函数,但往往会模糊构造函数的构成,例如包含许多返回对象实例的函数)。我仍然鼓励你使用特定术语来掌握当前的语言,并在比较讨论中预先定义你的条款。与往常一样,您在说话时选择的术语涉及到观众之间的权衡,能够轻松地跟随您,而观众可能会陷入混乱:如果您正在讨论的内存管理可能尽可能具体,但如果您说的是松散的话,那么只需使用你的听众理解的一些词,并准备澄清。

你的老师在最糟糕的情况下还不清楚,我不知道这些术语有任何规范的定义,但是他们可能会对从其他语言学到非常具体的定义的人造成混淆。