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