Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python __作为构造函数初始化?_Python_Constructor_Initialization - Fatal编程技术网

Python __作为构造函数初始化?

Python __作为构造函数初始化?,python,constructor,initialization,Python,Constructor,Initialization,- 这样做很诱人,但不正确 将其称为 班级。这很诱人,因为它看起来 就像构造器一样(按照惯例, \uuuu init\uuuu是为类定义的第一个方法),其行为类似于一个(它是 在程序中执行的第一段代码 新创建的类实例), 甚至听起来像一个(“init” 当然,这是一个很好的建议 自然)。不正确,因为对象 已由 调用time\uuuu init\uuuu,然后 已具有对的有效引用 类的新实例 Quote表明,将\uuuuuu init\uuuu作为构造函数调用是不正确的,因为在调用\uuuuuuu

-

这样做很诱人,但不正确 将其称为 班级。这很诱人,因为它看起来 就像构造器一样(按照惯例,
\uuuu init\uuuu
是为类定义的第一个方法),其行为类似于一个(它是 在程序中执行的第一段代码 新创建的类实例), 甚至听起来像一个(“init” 当然,这是一个很好的建议 自然)。不正确,因为对象 已由 调用time
\uuuu init\uuuu
,然后 已具有对的有效引用 类的新实例


Quote表明,将
\uuuuuu init\uuuu
作为构造函数调用是不正确的,因为在调用
\uuuuuuu init\uu
时,对象已被构造。但是我一直认为构造函数只有在对象被构造之后才被调用,因为它基本上是用来初始化实例的数据成员的,如果调用构造函数时对象不存在,这就没有意义了?(来自C++/Java背景)

如果您有一个类
Foo
,那么:

  • Foo()
    构造函数
  • Foo.\uuuu init\uuuuu()
    初始值设定项
  • 分配器

Python对象的构造只是分配一个新实例,然后初始化所述实例。

\uuuu init\uuuu
不是构造函数,但其原因在学习Python时对您来说并不重要。它的行为方式是用C++和java来构造构造函数。

构造函数返回一个实例,可能失败。但是
\uuuu init\uuuu
不返回实例。即使当
\uuuu init\uuuu
引发异常时,也会调用
\uuu del\uuuu
来删除实例

这可以在这里看到:

class A(object):
    def __init__(self):
        raise ValueError

    def __del__(self):
        print "Called"

def main():
    try:
        a = A()
    except ValueError, e:
        print "ValueError"

if __name__ == '__main__':
    main()
\uuuu new\uuuu
另一方面,返回一个实例

就我个人而言,我发现“
\uuuuu init\uuuuu
不是一个构造函数”非常令人毛骨悚然

当请求新对象时,调用
\uuuuuu init\uuuu
。它应该使用它的参数在新对象上分配属性,以便设置对象正常操作所需的不变量。当
\uuuu init\uuuu
中的代码开始运行时,对象已经是存储属性的有效预先存在的位置
\uuuu init\uuuu
中的代码开始运行时,新对象通常没有定义属性(所有对象都拥有的属性除外)

当请求一个新对象时调用C++构造函数。它应该使用其参数来分配给新对象上的字段,以便设置对象正常操作所需的不变量。当构造函数中的代码开始运行时,该对象已经是存储字段的有效预存位置当构造函数中的代码开始运行时,新对象的所有声明字段都已存在,但它们包含垃圾。

当请求新对象时,会调用Java构造函数。它应该使用其参数来分配给新对象上的字段,以便设置对象正常操作所需的不变量。当构造函数中的代码开始运行时,该对象已经是存储字段的有效预存位置当构造函数中的代码开始运行时,新对象已经有了其所有声明的字段,以及它们的默认值。

\uuuu init\uuu
方法和C++/Java构造函数之间的主要区别在于我强调的最后一句话,这就是Java/C++的静态特性和Python的动态特性之间的区别。我不认为这就有理由称它们为根本不同的概念,不能用同一个词来指代

我认为Pythonistas不喜欢将
\uuuu init\uuuu
称为构造函数的主要原因是人们认为C++/Java构造函数是“创建一个新对象”,因为当你调用它们时,它们似乎就是这么做的。但是当你调用构造函数时,实际上有两件事在发生;创建一个新对象,然后调用构造函数对其进行初始化。在C++/Java中,“创建一个新对象”部分是不可见的,而它可以在Python中公开/自定义(通过
\uuuuuuu new\uuu
方法)

因此,虽然
\uuuuu init\uuuu
方法的作用与C++/Java构造函数的作用极为相似,但有些人倾向于强调这并不是整个过程,他们说“
\uuuu init\uuu
不是一个构造函数”。

在约翰·泽尔的《Python编程:计算机科学导论》中说, “特殊方法
\uuuu init\uuuu
是对象构造函数
。Python调用此方法初始化新对象。
\uuu init\uuuu
的作用是为对象的实例变量提供初始值。”

From

\uuuu init\uuuu()
不是构造函数

[…]一个重要结论[…]是,
不是构造函数。许多天真的Python程序员对它感到困惑,因为当我们创建一个对象时,
\uuu init\uuu()
会被调用。仔细检查会发现
\uuuu init\uuuu()
中的第一个参数是对象本身(对象已经存在)。函数
\uuuu init\uuuu()
在对象创建后立即调用,并用于初始化它

从技术上讲,构造函数是一种创建对象本身的方法。在Python中,这个方法是
\uuuuu new\uuuu()
。此方法的一个常见特征是

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

关于Ben给出的答案,我在这里要说的是,大多数语言(完全)不遵循这个定义

进一步