On Sun, Apr 11, 2010 at 10:46 AM,  <pythonlist.cali...@spamgourmet.com> wrote:
> Generally, if I want to know the inheritance tree of a class, I either
> use inspect.getmro or __bases__
>
> However, after reading about the new numbers module / class tower in
> Python 2.6/3.0, I realized that both of these will fail to show that
> the 'float' type actually inherits from numbers.Real:

Well, as your introspection shows, it doesn't *actually* inherit from
numbers.Real.
However, it does "implement" the numbers.Real Abstract Base Class
(ABC) and this is reported via the results of issubclass().
Basically, `issubclass(x, y)` is no longer more-or-less just sugar for
`y in x.__mro__` due to changes that have been made to accommodate
ABCs.

Quoting from the `abc` module docs (http://docs.python.org/library/abc.html):
"""[...] You can also register unrelated concrete classes (even
built-in classes) [...] as “virtual subclasses” – these and their
descendants will be considered subclasses of the registering ABC by
the built-in issubclass()  function, but the registering ABC won’t
show up in their MRO (Method Resolution Order) nor will method
implementations defined by the registering ABC be callable."""

See also the relevant part of the ABC PEP (PEP 3119):
http://www.python.org/dev/peps/pep-3119/#overloading-isinstance-and-issubclass

Cheers,
Chris
--
http://blog.rebertia.com

>>>> import inspect, numbers
>>>> issubclass(float, numbers.Real)
> True
>>>> inspect.getmro(float)
> (<class 'float'>, <class 'object'>)
>>>> float.__bases__
> (<class 'object'>,)
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to