Интересно, когда использовать что аромат 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__(...)
?Давайте использовать следующие классы для демонстрации:
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 ) для получения дополнительной информации