Найти - Пользователи
Полная версия: super(self.__class__, self) vs super(ClassName, self)?
Начало » Python для экспертов » super(self.__class__, self) vs super(ClassName, self)?
1
gkraser
В документации (да и вообще почти везде) вызов super() предлагается делать в виде super(ClassName, self).
Однако вызов super(self.__class__, self) вроде то же работает. Да и удобнее.

В чем проблемы/недостатки вызова super(self.__class__, 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.
Подумайте сами, отчего так происходит.
Zubchick
сломал голову.
К вашему примеру:
>>> C is c.__class__
True
единственный вариант, это то что в B подставляется self из C, но почему - не понимаю…
gkraser
Zubchick
Подумайте сами, отчего так происходит.
Да, действительно, если подумать, то такая конструкция работать не будет….
Вот ведь знал же!

Zubchick
в B подставляется self из C
Так оно и есть. Ибо self это C, и self.__class__ is C во всей цепочке вызовов.
Андрей Светлов
Все верно. Пирожок - на полке :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB