Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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 直接调用init的目的是什么?_Python_Init - Fatal编程技术网

Python 直接调用init的目的是什么?

Python 直接调用init的目的是什么?,python,init,Python,Init,我很难弄清楚我遇到的一些代码的用途 代码有一个类Foo,它有一个\uuuu init\uuuu方法,该方法接受多个参数。根据到目前为止我对Python的了解,通过调用Foo('bar'),它将把这个字符串作为参数传递给\uuuuuu init\uuuuu(我认为它应该是构造函数的等价物) 但我遇到的问题是,我正在查看的代码正在直接调用Foo.\uu init\uu('bar')。这样做的目的是什么?我几乎觉得我在\uuuuu init\uuuu后面缺少了一些其他用途。Python允许您直接调用构

我很难弄清楚我遇到的一些代码的用途

代码有一个类
Foo
,它有一个
\uuuu init\uuuu
方法,该方法接受多个参数。根据到目前为止我对Python的了解,通过调用
Foo('bar')
,它将把这个字符串作为参数传递给
\uuuuuu init\uuuuu
(我认为它应该是构造函数的等价物)


但我遇到的问题是,我正在查看的代码正在直接调用
Foo.\uu init\uu('bar')
。这样做的目的是什么?我几乎觉得我在
\uuuuu init\uuuu

后面缺少了一些其他用途。Python允许您直接调用构造函数(
\uuuu init\uuu
)。通过调用
Foo.\uuuu init\uuj(obj,'bar')
,您正在对
obj

请参阅此代码:

class Foo:
    def __init__(self, s):
        self.s = s

f = Foo('abc')
print(f.s) # prints 'abc'
Foo.__init__(f, 'def')
print(f.s) # prints 'def'

是-继承类时调用父类的
\uuuu init\uuu()
。好了,这是显式调用
\uuuu init\uuu()
的唯一有效情况

当您实例化一个类时,会为您调用
\uuuuu init\uuuu()
方法。但是,父类中的
\uuuu init\uuu()
方法不会自动调用,因此如果要扩展其功能,需要直接调用它:

class A:

     def __init__(self, x):
          self.x = x

class B(A):

     def __init__(self, x, y):
          A.__init__(self, x)
          self.y = y
注意,上述调用也可以使用以下命令编写:


\uuuu init\uuuu()
方法的目的是初始化类。它通常负责填充实例变量。因此,您希望为类层次结构中的所有类调用
\uuuu init\uuu()

噢,亲爱的。请不要调用
\uuuu init\uuuu
在任何正常系统中执行重新初始化…我同意。对不起,如果我的解释不好。现在我只想展示一下
\uuuu init\uuu
的功能。不是应该调用它的地方。说“
\uuuu init\uuu
不是真正的构造函数,而是一个初始值设定项”是没有帮助的。这是有人在一本书中写的东西,曾经在互联网上被重复,尽管它毫无意义,只是让那些已经知道构造函数是什么的人和正在学习Python的人感到困惑<代码>\uuuu init\uuuu与其他语言的构造函数完全对应,官方Python文档甚至将其称为一个构造函数!如果您可以在任何其他OO语言中对现有对象调用构造函数,这正是它要做的。我找到了这个主题的第一个答案,它很好地恢复了我想要告诉您的内容:。另外,<>代码> y> iITys<并不完全对应于其他语言的构造函数,因为您不能用其他语言编写我所写的东西(如C、C++、java)。我想说的是,
\uuu init\uu
不像在其他语言中那样创建新对象,我认为了解这一点对于理解元类是很有用的。但是我知道,C++代码和java代码不应该被调用。正如我之前的评论所说的那样,@ SigFutt Java和C++构造函数也不创建新的对象。在调用构造函数时,对象已经创建好了(我不记得在构造函数中写过类似
this=malloc(…)
,是吗?)。
\uuuu init\uuuu
的目的是对一个“空白”对象进行操作,以初始化其中包含的数据,当您在创建对象之后但
SomeClass(…)
表达式将其值返回给调用方之前调用
SomeClass(…)
时,对象创建机制会自动调用该对象。在第二个示例代码块中,为什么在B构造函数中调用
super()。\uuuu init\uuuu(x)
,而不是调用
(super())(x)
?也许这是一个单独的问题,但是为什么
\uuu init\uu
调用的第一个参数不是B的
self
?调用
\uuuu init\uuuu
是否只有在需要传入某个对象以用作实例引用时才有必要?
class B(A):

     def __init__(self, x, y):
          super().__init__(x)
          self.y = y