Какой из этих 4 способов звонить супер () в Python 3 для использования?

Интересно, когда использовать что аромат Python 3 супер ().

Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class__, )
 |  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__(...)?

20
задан smci 16 September 2018 в 23:47
поделиться

1 ответ

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

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

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

17
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: