我如何初始化基础(超)类?

在Python中,考虑我有以下代码:

>>> class SuperClass(object): def __init__(self, x): self.x = x >>> class SubClass(SuperClass): def __init__(self, y): self.y = y # how do I initialize the SuperClass __init__ here? 

如何初始化子类中的SuperClass __init__ ? 我正在关注Python教程,并没有涉及到这一点。 当我在Google上search时,发现不止一种方式。 处理这个的标准方法是什么?

Python(直到版本3)支持“旧式”和新式的类。 新风格的类是从“对象”派生的,并且是你正在使用的,并且通过super()来调用它们的基类,例如

 class X(object): def __init__(self, x): pass def doit(self, bar): pass class Y(X): def __init__(self): super(Y, self).__init__(123) def doit(self, foo): return super(Y, self).doit(foo) 

因为python知道旧式和新式的类,所以有不同的方法来调用一个基本的方法,这就是为什么你find了多种方法。

为了完整起见,旧式类使用基类明确地调用基本方法,即

 def doit(self, foo): return X.foo(self, foo) 

但是既然你不再使用旧式,我也不会太在乎这个。

Python 3只知道新的类(不pipe你是否从对象派生)。

 SuperClass.__init__(self, x) 

要么

 super(SubClass,self).__init__( x ) 

将工作(我更喜欢第二个,因为它坚持更多的DRY原则)。

看到这里: http : //docs.python.org/reference/datamodel.html#basic-customization

从python 3.5.2开始,你可以使用:

 class C(B): def method(self, arg): super().method(arg) # This does the same thing as: # super(C, self).method(arg) 

https://docs.python.org/3/library/functions.html#super

我如何初始化基础(超)类?

 class SuperClass(object): def __init__(self, x): self.x = x class SubClass(SuperClass): def __init__(self, y): self.y = y 

使用super 。 在Python 2中:

  class SubClass(SuperClass): def __init__(self, y): super(SubClass, self).__init__('x') self.y = y 

在Python 3中,有一些魔法让super参数变得不必要:

  class SubClass(SuperClass): def __init__(self, y): super().__init__('x') self.y = y 

像这样对父进行硬编码可以防止使用协作式多重inheritance:

  class SubClass(SuperClass): def __init__(self, y): SuperClass.__init__(self, 'x') # don't do this self.y = y 

东西__new__

还有另一种方法来初始化实例 – 这是Python中不可变types的子类的唯一方法。 所以如果你想要str或者tuple或者另一个不可变的对象的子类,就需要它。

你可能认为这是一个类方法,因为它得到一个隐式的类参数。 但它实际上是一个静态方法。 所以你需要明确地用cls调用__new__

你也可能需要在你的基类中调用你的基础super 。 所以,如果你使用两种方法:

 class SuperClass(object): def __new__(cls, x): return super(SuperClass, cls).__new__(cls) def __init__(self, x): self.x = x class SubClass(object): def __new__(cls, y): return super(SubClass, cls).__new__(cls) def __init__(self, y): self.y = y super(SubClass, self).__init__('x') 

Python 3回避了超级静态方法导致的超级调用的一些奇怪之处:

 class SuperClass(object): def __new__(cls, x): return super().__new__(cls) def __init__(self, x): self.x = x class SubClass(object): def __new__(cls, y): return super().__new__(cls) def __init__(self, y): self.y = y super().__init__('x')