On Sun, Jun 27, 2010 at 2:09 AM, Steven D'Aprano <st...@pearwood.info> wrote: > On Sun, 27 Jun 2010 03:05:16 am Payal wrote: >> >> Can you give any simple example where this simple mro will work >> incorrectly? > > Probably not... it's quite complicated, which is why it's rare. I'll > have a think about it and see what I can come up with. >
Here's my attempt. Consider this simple Diamond hierarchy: class A: def x(self): return "in A" class B(A): pass class C(A): def x(self): return "in C" class D(B, C): pass A / \ / \ B C \ / \ / D Now, with this diagram the following code probably doesn't do what you expect: >>> obj = D() >>> obj.x() 'in A' D inherits from C, which overrides the x method. But this is seemingly completely ignored by python, which produces the A.x method! So why does this happen? well, the old MRO uses a simple depth-first, left-to-right search. This means that to find a method, python first looks into the leftmost parent, then its leftmost parent, et cetera et cetera. For our diamond, that means this MRO: D, B, A, C, A so, when you try to access D.x, it will look first in D (not found), B (not found), then A, producing the A.x method. And this probably isn't what you want (we inherited from C for a reason, you know). For new style classes, the MRO is actually D, B, C, A. That produces the correct results. The algorithm is a little complicated, and if you would like to know, the link you posted earlier has all the details. Hugo _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor