为什么python super不只接受实例?
在Python2.x中,super接受以下情况为什么python super不只接受实例?,python,language-design,Python,Language Design,在Python2.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) |
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(instance)
。从技术上讲,您可以从对象本身获取对象的类型,因此当前的策略super(self)。\uuuu init\uuuu()
有点多余。我假设与旧式类或多重继承存在兼容性问题,但我想听听您的观点super(ClassType,self)。\uuu init\uuu()
- 另一方面,为什么python 3会接受(请参阅)
super()?我从中看到了一种魔力,违反显式的禅宗比隐式的禅宗好。我会看到更合适的
self.super()
super(ClassType,self)。\uuuu init\uuuu()
在合作多重继承方案中并不冗余--ClassType
不一定是self
的类型,但是要从中执行对\uuuu init\uuuu
的协作调用的类
在类层次结构C继承B继承A
,在C.\uuuu init\uuuu
中,您想从C的
透视图调用超类'init',然后调用B.\uu init\uuuu
;然后在B.\uuuu init\uuuu
中,您必须将类类型B
传递给super——因为您想要解析调用B的超类(或者更确切地说,是类C的B之后的mro中的下一个超类)
如果您现在实例化c=c()
,您会看到类类型不是冗余的--super(self)。\uuuuu init\uuuuu()
内部B.\uuuu init\uuuuuu
不会真正工作!您要做的是手动指定调用super的方法在哪个类中(在Python3的super中,这是通过一个指向该方法的类的隐藏变量来解决的)
超级继承和多重继承示例的两个链接:
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__()