python 3.x - mro: why are methods from both parent called? -


i playing classes see how mro works in python3. got main idea: methods resolved left right, depth first , if there common parent, it's @ end.

here apparently quite simple not behave expect:

class a(object):     def f(self):         print("calling a")         print("a")   class b(a):     def f(self):         print("calling b")         super(b, self).f()         print("b")   class c(a):     def f(self):         print("calling c")         super(c, self).f()         print("c")   class d(b,c):     def f(self):         print("calling d")         super(d, self).f()         print("d")  d=d() d.f() 

now, since mro d -> b -> c -> a expect super call b.f prints:

calling d calling b calling a b d 

but call c.f too:

calling d calling b calling c calling a         c         b         d         

why that?

the reason expect c.f not called since b method f, resolution should stop. case if c not inherit a:

class a(object):     def f(self):         print("calling a")         print("a")   class b(a):     def f(self):         print("calling b")         super(b, self).f()         print("b")   class c():     def f(self):         print("calling c")         super(c, self).f()         print("c")   class d(b,c):     def f(self):         print("calling d")         super(d, self).f()         print("d")  d=d() d.f() # prints: # calling d # calling b # calling #         # b         # d         

i think it's important mention super doesn't call "parent-class" "next class in mro".

you said yourself, mro d -> b -> c -> a d. super in d.f resolve b, super in b.f resolve c , super in c.f resolve a.

if need further information there several ressources (with different interpretations usefulness of super) avaiable:


Comments