在父类

时间:2017-12-05 18:48:16

标签: python python-3.x inheritance super

我正在阅读Raymond Hettinger的Python’s super() considered super!关于页面,有这个例子:

class Shape:
    def __init__(self, shapename, **kwds):
        self.shapename = shapename
        super().__init__(**kwds)        

class ColoredShape(Shape):
    def __init__(self, color, **kwds):
        self.color = color
        super().__init__(**kwds)

cs = ColoredShape(color='red', shapename='circle')

为什么有必要在此super()致电Shape?我的理解是,这会调用object.__init__(**kwds),因为Shape隐式继承自object

即使没有这个陈述,我们已经

  • 已在父级shapename中确定__init__
  • 在显式方法覆盖中建立了子类的color
  • 然后在__init__中使用super()调用了父级ColoredShape

据我所知,放弃这一行会产生相同的行为。功能性:

class Shape:  # (object)
    def __init__(self, shapename, **kwds):
        self.shapename = shapename
        # super().__init__(**kwds)

class ColoredShape(Shape):
    def __init__(self, color, **kwds):
        self.color = color
        super().__init__(**kwds)
    def check(self):
        print(self.color)
        print(self.shapename)

cs = ColoredShape(color='red', shapename='circle')

cs.check()
# red
# circle

此处super()Shape的目的是什么?

2 个答案:

答案 0 :(得分:7)

重点是合作多重继承。整篇文章的重点是合作多重继承,真的。

你看Shape,除了object之外你没有看到任何父母。当然,但这并不意味着在Shape之后MRO上没有任何兄弟姐妹或其他任何东西。 super()不仅适用于超类;它在method resolution order中搜索该方法的下一个实现。例如,本文后面的一个类是

class MovableColoredShape(ColoredShape, MoveableAdapter):
    pass

在这种情况下,Shape.__init__需要拨打super().__init__MoveableAdapter.__init__,并且会跳过所有进一步的__init__来电。

答案 1 :(得分:5)

我看到@ user2357112已经提供了正确答案。我正在研究一个例子,虽然我离开这里,因为它几乎是user2357112所描述的。考虑一下这样的mixin类:

class PositionMixin:
    def __init__(self, x=0, y=0, **kwds):
        super().__init__(**kwds)
        self.x = x
        self.y = y

我们假设您将其应用于ColoredShape班级:

class ColoredShape(Shape, PositionMixin):
    def __init__(self, color, **kwds):
        self.color = color
        super().__init__(**kwds)

如果Shape没有拨打super.__init__,那么当你这样做时:

myshape = ColoredShape('red', shapename='circle', x=1, y=1)
print(myshape.x, myshape.y)

你得到:

Traceback (most recent call last):
  File "supertest.py", line 18, in <module>
    print (myshape.x, myshape.y)
AttributeError: 'ColoredShape' object has no attribute 'x'

super.__init__上调用__init__方法时,必须调用PositionMixin形状。