Перечислить все базовые классы в иерархии данного класса?
-
05-07-2019 - |
Вопрос
Учитывая класс 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 каждый класс наследуется от базового класса объектов.