从子类继承的属性会打印子对象,而不是父对象的字符串

时间:2018-10-10 17:34:33

标签: python class inheritance

我知道已经解决了许多有关Python中的类继承的主题,但是我找不到解决该特定问题的线程。

编辑:我正在运行Python 3.5.5。

代码:

class Parent():
    def __init__(self, parentParam="parent param"):
        self.parentParam = parentParam

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__(self)

child = Child()
print(child.childParam)
print(child.parentParam)

输出:

child param
<__main__.Child object at 0x0000017CE7C0CAC8>

为什么child.parentParam返回子对象而不返回字符串"parent param"?我觉得它应该打印出为Parent类设置的默认字符串。这似乎与我在this tutorial中遵循的语法相同。

谢谢大家。

2 个答案:

答案 0 :(得分:5)

因为您将子实例(也称为self)提供给超级调用:

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__(self) # here you override the default by supplying this instance

使用:

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__() 

相反,您会得到以下输出:

child param
parent param

答案 1 :(得分:4)

您对super的呼叫是错误的。使用它将方法调用委托给超类时,不必显式传递self参数(请参见documentation中所示的典型用法示例)。

在Python 3中,不带参数的对super()的调用等效于super(CurrentClass, self).method(arg)(这是在Python 2中可以完成的唯一方法),从而使得不再需要在任何时候都指定它调用超类方法。

因此,由于您在代码中传递了它,所以正在发生的事情是它被解释为覆盖为parentParam参数指定的默认值。

这里做得正确,结果:

class Parent:
    def __init__(self, parentParam="parent param"):
        self.parentParam = parentParam


class Child(Parent):
    def __init__(self, childParam="child param"):
        self.childParam = childParam
        super().__init__()  # NO NEED TO PASS self.


child = Child()
print(child.childParam)   # -> child param
print(child.parentParam)  # -> parent param