【问题标题】:Python class object creation in inheritance在继承中创建 Python 类对象
【发布时间】:2016-05-16 21:47:22
【问题描述】:

我在 python 中有以下类:

class Foo():
    def __init__(self):
        self.id=8
        self.value=self.get_value() #Mark-1
    def get_value(self):
        pass
    def should_destroy_earth(self):
        return self.id ==42

class Baz(Foo):
    def get_value(self,some_new_parameter):
        pass

在这里,我可以像这样创建一个 Foo 类的对象:

ob1 = Foo() # 成功

但是,如果我尝试创建 Baz 的对象,则会引发错误:

Ob2 = Baz() # 错误

  File "classesPython.py", line 20, in <module>
    ob2 = Baz()
  File "classesPython.py", line 4, in __init__
    self.value=self.get_value()
TypeError: get_value() takes exactly 2 arguments (1 given)

如果我删除类 Foo 的第 3 行中的“self.get_value”,我可以创建类 Baz 的对象。

不是这样的,当我们在python中继承一个类时,超类的init方法并没有被子类继承,我们需要显式的调用它们(例如 Superclass.init(self) )?

因此,当我创建 Baz 的对象时,默认情况下不会调用 Foo() 类的 __init__ 方法。那么为什么我不能为 Baz 创建对象呢?

【问题讨论】:

  • 真正的问题不是Baz 实际上不支持与Foo 相同的接口,因此不应该 是它的子类吗?你能举一个不那么抽象的例子吗?
  • 是的,你是对的,但这更多是为了理解python的惯用方法。

标签: python python-2.7


【解决方案1】:

不,你有一些根本的误解。 Foo__init__ 方法肯定Baz 继承。

Python 将假定您希望子类使用相同的 __init__ 实现,因为您没有实现其他任何东西。如果您不想要这种行为,您必须自己在Baz 中明确定义它。

【讨论】:

    【解决方案2】:

    不是这样的,当我们在python中继承一个类时,init 超类的方法不被子类继承,我们需要 显式调用它们(例如 Superclass.init(self) )?

    不,仅当子类具有__init__ 方法时才会出现这种情况。

    【讨论】:

    • 我明白了,所以我在子类 Baz 中创建了一个 init 方法,现在我可以创建一个对象。所以这里的概念是,如果我继承超类 init 方法只有在我没有为派生类定义 init 方法时才会执行。我的断言正确吗?
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多