Список всех базовых классов в иерархии данного класса? - PullRequest
115 голосов
/ 09 сентября 2009

Учитывая класс Foo (будь то новый стиль класс или нет), как вы генерируете все базовые классы - где угодно в иерархии наследования - это issubclass из?

Ответы [ 6 ]

169 голосов
/ 10 сентября 2009

inspect.getmro(cls) работает как для новых, так и для старых стилей и возвращает то же, что и NewClass.mro(): список класса и всех его классов-предков в порядке, используемом для разрешения метода. *

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
38 голосов
/ 09 сентября 2009

См. __bases__ свойство , доступное на питоне class, которое содержит кортеж базовых классов:

>>> def classlookup(cls):
...     c = list(cls.__bases__)
...     for base in c:
...         c.extend(classlookup(base))
...     return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
30 голосов
/ 09 сентября 2009

inspect.getclasstree() создаст вложенный список классов и их баз. Использование:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
21 голосов
/ 09 сентября 2009

вы можете использовать __bases__ кортеж объекта класса:

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

Кортеж, возвращаемый __bases__, имеет все свои базовые классы.

Надеюсь, это поможет!

2 голосов
/ 02 февраля 2018

Хотя ответ Йохена очень полезен и корректен, поскольку вы можете получить иерархию классов с помощью метода .getmro () модуля inspect, также важно подчеркнуть, что иерархия наследования Python выглядит следующим образом:

например:

class MyClass(YourClass):

Класс наследования

  • Детский класс
  • Производный класс
  • Подкласс

например:

class YourClass(Object):

Унаследованный класс

  • Родительский класс
  • Базовый класс
  • Superclass

Один класс может наследоваться от другого - Приписываемый класс наследуется - в частности, его методы наследуются - это означает, что экземпляры наследуемого (дочернего) класса могут получить доступ к атрибуту наследуемого (родительского) класса

instance -> class -> затем унаследованные классы

с помощью

import inspect
inspect.getmro(MyClass)

покажет вам иерархию внутри Python.

0 голосов
/ 22 июня 2019

В python 3.7 вам не нужно импортировать проверку, type.mro выдаст вам результат.

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

обратите внимание, что в Python 3.x каждый класс наследуется от базового класса объекта.

...