gpt4 book ai didi

python - 为什么python super不只接受实例?

转载 作者:太空狗 更新时间:2023-10-30 00:47:02 27 4
gpt4 key购买 nike

在 python 2.x 中,super 接受以下情况

class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:

据我所知,super 是一个类,包装类型和(最终)实例以解析类的父类(super class)。

我对一些事情感到很困惑:

  • 为什么也没有 super(instance),典型用法例如super(self).__init__()。从技术上讲,您可以从对象本身获取对象的类型,因此当前策略 super(ClassType, self).__init__() 有点多余。我假设与旧式类或多重继承存在兼容性问题,但我想听听你的观点。
  • 为什么另一方面,python 3 会接受(参见 Understanding Python super() with __init__() methods)super().__init__()?我在这看到了一种魔力,违反显性比隐性禅更好。我会看到更合适的 self.super().__init__()

最佳答案

super(ClassType, self).__init__() 在合作多重继承方案中是多余的 -- ClassType 不一定是self 的类型,但是您要从中对 __init__ 进行协作调用的类。

在类层次结构C继承B继承A中,在C.__init__中你想从C的角度调用父类(super class)的init,并且你调用 B.__init__;然后在 B.__init__ 中,您必须将类类型 B 传递给 super - 因为您想要解析 B 的调用父类(super class)(或者更确切地说,是 B 之后的 mro 中的下一个) C类)。

class A (object):
def __init__(self):
pass

class B (A):
def __init__(self):
super(B, self).__init__()

class C (B):
def __init__(self):
super(C, self).__init__()

如果您现在实例化 c = C(),您会发现类类型不是多余的 -- super(self).__init__() inside B.__init__ 不会真正起作用!您所做的是手动指定调用 super 的方法在哪个类中(这在 Python 3 的 super 中通过指向方法类的隐藏变量解决)。

带有超继承和多重继承示例的两个链接:

关于python - 为什么python super不只接受实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1957251/

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