On Fri, Apr 15, 2022 at 11:12:26PM +1000, Chris Angelico wrote:

> > If you look at languages that implement MI, and pick the implementations
> > which allow it with the fewest restrictions, then that is "full MI".
> 
> I'm with Greg on this one, for the simple reason that a future
> language could have fewer restrictions than Python does,

Not without making inheritance incoherent and inconsistent.

E.g. in Python 2.2 and below, it was possible to design class 
hierarchies that resulted in methods being called twice or more times.

Other signs of an incoherent MI model might include:

* loops or cycles in your precedence graph;

* superclasses being skipped;

* inconsistent ordering (class A coming before class B for one method, 
  but B before A for another method);

* violating local precedence order, e.g. class Spam has A come 
  before B, but in Spam's subclass the order flips to B before A;

* or the order changes if you change the name of a class and nothing
  else about it.

These are all Bad Thingsā„¢ and Python avoids them all.

You can only generalise MI up to a certain point, after which it becomes 
inconsistent and therefore buggy. That's why Python 2.2's MRO was 
dropped for the C3 linearization in 2.3: it was buggy.

I'm assuming automatic conflict resolution. If its not automatic, it's 
not what I'm calling inheritance. If you have to manually specify which 
superclass to call, that's delegation.

That's okay: inheritance is not the be all and end all of OOP. You can 
use delegation to solve problems too, or manual conflict resolution by 
renaming methods, as Eiffel does. And as I said before, it might be that 
the Eiffel or C++ model is *better* than Python's model.

But given the assumptions that:

- the inheritance model automatically resolves conflicts;

- the MRO is entirely dependendent on the shape of the inheritance 
  graph, and not on incidental properties like the name of classes;

- the inheritance model is consistent, monotonic and preserves local 
  precedence order (C3 linearization);

then I believe that the Dylan/Python/Ruby/Perl/Raku MI model is as 
general as you can get, and models like Eiffel or C++ are more 
restrictive.

I believe that you cannot drop any of those restrictions without the 
very idea of inheritance becoming incoherent.

It is not a "No True Scotsman" fallacy. Other models of MI are 
legitimate even if they are not fully general. I have suggested that 
Python's fully generalised MI model may ultimately be worse than more 
restrictive models that provide less freedom to write unmaintainable 
code. I have repeatedly linked to the writing of Michele Simionato who 
explores these issues in excruciating detail.


> and therefore
> would become the only thing that offers "full MI", displacing other
> languages. It's a meaningless concept, unless there is some form of
> absolute completeness that can be attained

Well duh Chris, sometimes I wonder if you read my posts before jumping 
in to disagree with me, that is *exactly* what I am arguing.

If you exclude models of MI which are logically incoherent and 
inconsistent, (such as Python's prior to version 2.3), then Python's 
model of MI is objectively as complete as you can get.

Whether I am right or wrong, this is an objective matter of fact, not a 
matter of taste or opinion, and it is certainly not a "No True Scotsman" 
value judgement against using more restrictive forms of MI.


> My view: If a class inherits two parents, in any meaning of the word
> "inherits" that follows the normal expectation that a subclass IS an
> instance of its parent class(es), then it's MI.

Inheritance and "is-a" relationships are independent.

In some languages (but not Python), mixins provide inheritance but not 
an "is-a" relationship. In Python, virtual subclassing provides "is-a" 
without inheritance.



-- 
Steve
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/TEXBXLQ5HZFYDXO25YOGMQ7YHLS4JSQV/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to