【问题标题】:How to correctly call base class methods (and constructor) from inherited classes in Python? [duplicate]如何从 Python 中的继承类中正确调用基类方法(和构造函数)? [复制]
【发布时间】:2011-01-26 03:37:54
【问题描述】:

假设我有一个Base 类和一个继承自BaseChild 类。从Python中的子类调用基类构造函数的正确方法是什么?我用super吗?

这是我目前所拥有的一个例子:

class Base(object):
   def __init__(self, value):
       self.value = value
   ...

class Child(Base):
   def __init__(self, something_else):
       super(Child, self).__init__(value=20)
       self.something_else = something_else
   ...

这对吗?

谢谢,博达·赛多。

【问题讨论】:

  • Ignacio,我测试过,但还有其他方法,例如在Child,我可以做def __init__(self, something_else): Base.__init__(value=20),我不知道我是否可以这样做......因此我想知道如何以现代 Python 方式绝对正确地做到这一点。

标签: python


【解决方案1】:

没错。请注意,您也可以直接在Base 类上调用__init__ 方法,如下所示:

class Child(Base):
    def __init__(self, something_else):
        Base.__init__(self, value = 20)
        self.something_else = something_else

这就是我通常这样做的方式。但是不鼓励这样做,因为在存在多重继承的情况下它的表现不是很好。当然,多重继承本身就有各种奇怪的影响,所以我像瘟疫一样避免它。

一般来说,如果你继承的类使用super,你也需要这样做。

【讨论】:

  • 感谢您描述这两种方法。我不确定Base.__init__ 一个。
  • 您可以在示例中添加除“值”之外的其他参数吗?顺序重要吗?如果将值分配给值怎么办?
  • 在 python 3.9 中呢?
  • 如果我想从 super 调用 super 怎么办?我可以做类似super(BaseBase, self).__init__(value) 的事情吗?
【解决方案2】:

如果您使用的是 Python 3.1,super 是新的和改进的。它为您找出类和实例参数。所以你应该在没有参数的情况下调用 super:

class Child(Base):
    def __init__(self, value, something_else):
        super().__init__(value)
        self.something_else = something_else
    ...

【讨论】:

  • 如果我想从 super 调用 super 怎么办?我可以做类似super(BaseBase, self).__init__(value) 的事情吗?
【解决方案3】:

是的,没错。如果您希望能够将 value 传递给 Child 类,您可以这样做

class Child(Base):
   def __init__(self, value, something_else):
       super(Child, self).__init__(value)
       self.something_else = something_else
   ...

【讨论】:

  • 感谢您说明如何将值传递给 Child,然后将该值传递给 Base!
  • 您还需要确保 Child 的所有超类都可以接受该值并将其传递,因为通常您无法确定 Base 是下一个调用的值。
  • 如果我想从 super 调用 super 怎么办?我可以做类似super(BaseBase, self).__init__(value) 的事情吗?
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多