我正在阅读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
的目的是什么?
答案 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
形状。