21

我不知道什么时候使用 Python 3 super () 的什么味道。

Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  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)

到目前为止,我super()只使用了不带参数的方法,并且它按预期工作(由 Java 开发人员提供)。

问题:

  • 在这种情况下,“绑定”是什么意思?
  • 绑定和未绑定的超级对象有什么区别?
  • 何时使用super(type, obj),何时使用super(type, type2)
  • 将超类命名为 in 会更好Mother.__init__(...)吗?
4

2 回答 2

18

让我们使用以下类进行演示:

class A(object):
    def m(self):
        print('m')

class B(A): pass

未绑定super对象不会将属性访问分派给类,您必须使用描述符协议:

>>> super(B).m
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'm'
>>> super(B).__get__(B(), B)
<super: <class 'B'>, <B object>>

super绑定到实例的对象提供绑定方法:

>>> super(B, B()).m
<bound method B.m of <__main__.B object at 0xb765dacc>>
>>> super(B, B()).m()
m

super绑定到类的对象提供函数(根据 Python 2 的未绑定方法):

>>> super(B, B).m
<function m at 0xb761482c>
>>> super(B, B).m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: m() takes exactly 1 positional argument (0 given)
>>> super(B, B).m(B())
m

有关更多信息,请参阅 Michele Simionato 的“关于 Python Super 的须知”博文系列1、2、3

于 2010-05-05T13:28:15.797 回答
8

快速说明一下,PEP3135 New Supersuper中概述了 的新用法,它是在 python 3.0 中实现的。特别相关;

super().foo(1, 2)

替换旧的:

super(Foo, self).foo(1, 2)
于 2015-06-03T08:47:44.463 回答