gpt4 book ai didi

python - 在父类中调用 `super()`

转载 作者:太空狗 更新时间:2023-10-29 18:27:12 26 4
gpt4 key购买 nike

我正在阅读 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')

这里为什么要调用Shape中的super()?我的理解是,这会调用 object.__init__(**kwds),因为 Shape 隐式继承自 object

即使没有那个声明,我们也已经

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

据我所知,删除这一行会产生相同的行为和功能:

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

这里 Shape 中的 super() 的目的是什么?

最佳答案

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

您查看 Shape,但除了 object 之外,您没有看到任何父项。当然可以,但这并不意味着在 Shape 之后 MRO 上没有任何 sibling 或任何其他东西。 super() 不仅适用于父类(super class);它在 method resolution order 中搜索该方法的下一个实现。 .比如文章后面的一个类是

class MovableColoredShape(ColoredShape, MoveableAdapter):
pass

在这种情况下,Shape.__init__ 需要调用 super().__init__MoveableAdapter.__init__ 以及所有进一步的 __init__ 调用将被跳过。

关于python - 在父类中调用 `super()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47660676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com