Перечислить все базовые классы в иерархии данного класса?

StackOverflow https://stackoverflow.com/questions/1401661

Вопрос

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

Это было полезно?

Решение

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'>)

Другие советы

См. __ баз __ свойство . на питоне 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>]

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

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

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

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

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

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

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

бывший:

class MyClass(YourClass):

Наследующий класс

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

бывший:

class YourClass(Object):

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

  • Родительский класс
  • Базовый класс
  • Суперкласс

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

экземпляр → класс → затем унаследованные классы

с использованием

import inspect
inspect.getmro(MyClass)

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

  

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top