When you are delegating implementations to other parts of code, being "explicit" about how that code is written defeats the purpose. Knowing exactly what is being called equates to having a dependency on that implementation so that if one piece of code changes the other must change also.
Consider that the problem of ambiguity still exists with the old Baz.who_knows(self)
method. If Baz
does not override who_knows
, then you still don't know which of Baz
's superclasses define the actual implementation. So do you change that line in Foo
's code to point to the class that actually implements it? But if you then do decide to override it in Baz
, you need to update Foo
again (as well as all other subclasses).