2010-05-05 6 views
20

Интересно, когда использовать какой аромат Python 3 super().Использование 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__(...)?

ответ

17

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

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 

См Michele Симионато в «Что нужно знать о Python Супер» серии блог (1, 2, 3) для более информация

+0

Речь идет конкретно о Python3, но серия сообщений в блоге Симионато являются около python2, и отметить, что * Преимущество заключается в том, что вы избегаете повторять имя из класс в вызывающем синтаксисе, поскольку это имя скрыто в механизме переключения частных имен. *. Это уже не верно в Python3, поэтому, по крайней мере, это преимущество датируется. – gerrit

7

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

super().foo(1, 2) 

заменить старый:

super(Foo, self).foo(1, 2) 
Смежные вопросы