关于oop:在python 3中调用super()的4种方法中,哪一种可以使用?

Which of the 4 ways to call super() in Python 3 to use?

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

1
2
3
4
5
6
7
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)

直到现在,我还使用了EDCOX1(0),而没有参数,它像Java开发人员那样工作。

问题:

  • 在这种情况下,"绑定"是什么意思?
  • 绑定超对象和未绑定超对象有什么区别?
  • 何时使用super(type, obj),何时使用super(type, type2)
  • 像在Mother.__init__(...)中那样命名超级类会更好吗?


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

1
2
3
4
5
class A(object):
    def m(self):
        print('m')

class B(A): pass

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

1
2
3
4
5
6
>>> 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对象给出绑定方法:

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

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

1
2
3
4
5
6
7
8
>>> 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)。


一个简短的说明是,在python 3.0中实现的pep3135 new super中概述了super的新用法。特别相关的;

1
super().foo(1, 2)

要替换旧的:

1
super(Foo, self).foo(1, 2)