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

Ste*_*ini 5 python language-design

在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:
Run Code Online (Sandbox Code Playgroud)

据我所知,super是一个类,包装类型和(最终)实例来解析类的超类.

我对以下几件事感到困惑:

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

u0b*_*6ae 6

super(ClassType, self).__init__()不是用于在协同多继承方案多余的- ClassType不一定的类型self,但要做到合作调用类__init__.

在类层次结构中C inherits B inherits A,C.__init__您希望从C's透视图调用超类'init ,并调用B.__init__; 然后在B.__init__你必须将类类型传递B给super - 因为你想要解析B的调用超类(或者更确切地说,是C类B之后的mro中的下一个).

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__()
Run Code Online (Sandbox Code Playgroud)

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

两个链接,包含超级和多重继承的示例: