Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 15, 2010 17:39:47

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

super(self.__class__, self) vs super(ClassName, self)?

В документации (да и вообще почти везде) вызов super() предлагается делать в виде super(ClassName, self).
Однако вызов super(self.__class__, self) вроде то же работает. Да и удобнее.

В чем проблемы/недостатки вызова super(self.__class__, self)?



Офлайн

#2 Июнь 15, 2010 18:38:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

super(self.__class__, self) vs super(ClassName, self)?

недостаток ровно один - ваш метод нерабочий.

class A(object):
def f(self):
print 'A.f'
return None

class B(A):
def f(self):
print 'B.f'
return super(self.__class__, self).f()

class C(B):
def f(self):
print 'C.f'
return super(self.__class__, self).f()


c = C()

c.f()
дает в результате RuntimeError: Recursion limit.
Подумайте сами, отчего так происходит.



Офлайн

#3 Июнь 15, 2010 19:24:29

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

super(self.__class__, self) vs super(ClassName, self)?

сломал голову.
К вашему примеру:

>>> C is c.__class__
True
единственный вариант, это то что в B подставляется self из C, но почему - не понимаю…



Отредактировано (Июнь 15, 2010 19:26:30)

Офлайн

#4 Июнь 15, 2010 19:36:36

gkraser
От:
Зарегистрирован: 2007-08-25
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

super(self.__class__, self) vs super(ClassName, self)?

Zubchick
Подумайте сами, отчего так происходит.
Да, действительно, если подумать, то такая конструкция работать не будет….
Вот ведь знал же!

Zubchick
в B подставляется self из C
Так оно и есть. Ибо self это C, и self.__class__ is C во всей цепочке вызовов.



Офлайн

#5 Июнь 15, 2010 20:12:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

super(self.__class__, self) vs super(ClassName, self)?

Все верно. Пирожок - на полке :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version