Как получить родителей класса Python? - программирование

Как получить родителей класса Python?

Как я могу получить родительский класс (классы) класса Python?

4b9b3361

Ответ 1

Используйте следующий атрибут:

cls.__bases__

Из docs:

Кортеж базовых классов класса объект.

Пример:

>>> str.__bases__
(<type 'basestring'>,)

Другой пример:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)

Ответ 2

Если вы хотите, чтобы все предки, а не только ближайшие, используйте inspect.getmro:

import inspect
print inspect.getmro(cls)

Пользуясь этим, вы получаете все классы предков в "порядке разрешения метода" - то есть порядок, в котором предки будут проверяться при разрешении метода (или, фактически, любых других атрибутов - методов и других атрибутов, находящихся в одно и то же пространство имен в Python, -).

Ответ 3

В классах нового стиля есть метод mro, который вы можете вызвать, который возвращает список родительских классов в порядке разрешения метода.

Ответ 4

Если вы хотите, чтобы все они вызывались, используйте super на всех уровнях.

Ответ 5

Используйте базы, если вы просто хотите получить родителей, используйте __mro__ (как указано @naught101) для получения порядка разрешения методов (чтобы узнать, в каком порядке выполнялись инициалы).

Основы (и сначала получение класса для существующего объекта):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)

Для mro в последних версиях Python:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)

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

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)

Ответ 6

Самый быстрый способ, чтобы увидеть всех родителей, и В ПОРЯДКЕ, просто используйте встроенный __mro__

то есть repr(YOUR_CLASS.__mro__)


>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__

выходы, В ПОРЯДКЕ


(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>, 
<type 'exceptions.BaseException'>, <type 'object'>)
>>>

Там у вас есть это. "Лучший" ответ на данный момент имеет 182 голоса (как я набираю это), но это НАСТОЛЬКО проще, чем некоторые замысловатые для цикла, рассматривая базы по одному классу за раз, не говоря уже о том, когда класс расширяет ДВА или более родительский классы. Импортируя и используя inspect просто затеняет область видимости. Честно говоря, это позор, что люди не знают просто использовать встроенные модули

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