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 |
未绑定的
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>> |
绑定到实例的
1 2 3 4 | >>> super(B, B()).m <bound method B.m of <__main__.B object at 0xb765dacc>> >>> super(B, B()).m() m |
绑定到类的
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中概述了
1 | super().foo(1, 2) |
要替换旧的:
1 | super(Foo, self).foo(1, 2) |