Какой из 4 способов вызова super () в Python 3 использовать? - PullRequest
20 голосов
/ 05 мая 2010

Интересно, когда использовать какой аромат 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)?
  • Было бы лучше назвать суперкласс, как в Mother.__init__(...)?

Ответы [ 2 ]

17 голосов
/ 05 мая 2010

Давайте использовать следующие классы для демонстрации:

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

class B(A): pass

Unbound 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

См. Серию публикаций Микела Симионато «Что нужно знать о Python Super» ( 1 , 2 , 3 ) для получения дополнительной информации

7 голосов
/ 03 июня 2015

Краткое примечание: новое использование super описано в PEP3135 New Super , который был реализован в python 3.0 Особой актуальности;

super().foo(1, 2)

для замены старого:

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