В документации (да и вообще почти везде) вызов 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()
>>> C is c.__class__
True
ZubchickДа, действительно, если подумать, то такая конструкция работать не будет….
Подумайте сами, отчего так происходит.
ZubchickТак оно и есть. Ибо self это C, и self.__class__ is C во всей цепочке вызовов.
в B подставляется self из C