9

我很难弄清楚我遇到的一些代码的目的。

代码有一个 class Foo,它有一个__init__接受多个参数的方法。根据我目前对 Python 的了解,通过调用Foo('bar'),它会将此字符串作为参数传递给__init__(我认为它应该相当于构造函数)。

但是我遇到的问题是我正在查看的代码是Foo.__init__('bar')直接调用的。这样做的目的是什么?我几乎觉得我在背后失去了一些其他的目的__init__

4

3 回答 3

22

当您实例化一个类时,该__init__()方法会为您调用。但是,__init__()父类中的方法不会被自动调用,所以如果你想扩展它的功能,你需要直接调用它:

class A:

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

class B(A):

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

注意,上面的调用也可以使用super编写:

class B(A):

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

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

于 2013-04-21T00:31:39.790 回答
3

Python 允许您直接调用构造函数 ( __init__)。通过调用Foo.__init__(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'
于 2013-04-21T00:29:29.870 回答
0

是 - 当继承__init__()父类​​的类调用时。AFAIK,这是唯一有效的__init__()显式调用情况。

于 2013-04-21T00:31:14.170 回答