class Base(object):
def m(self):
print 'base'
class MixinA(Base):
def m(self):
super(MixinA, self).m()
print 'mixin a'
class MixinB(Base):
def m(self):
super(MixinB, self).m()
print 'mixin b'
class Top(MixinB, MixinA, Base):
def m(self):
super(Top, self).m()
print 'top'
t = Top()
t.m()
Печатается:ли супер попробовать каждый класс в MRO
base
mixin a
mixin b
top
Я удивлен несколько вещей. Во-первых MRO из Top
является (<class 'Top'>, <class 'MixinB'>, <class 'MixinA'>, <class 'Base'>, <type 'object'>)
- Почему
mixin a
предшествуетmixin b
? - Does
super
попробовать каждый класс в MRO (в отличие от поиска атрибута при возврате первого атрибута)?
'super (MixinB) .m()' не вызывает 'MixinA.m()' – Marii
@Marii: да, это так. 'MixinA' - следующий класс в MRO' type (self) '. –
@Marii: Не путайте. Мы используем MRO 'Top', а не' MixinB' как отдельный класс. При смешивании в 'Top', как показано,' super (MixinB, self) '(с' type (self) == Top') на самом деле 'MixinA'. – dhke