Как получить родителей класса Python? - PullRequest
170 голосов
/ 10 апреля 2010

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

Ответы [ 6 ]

195 голосов
/ 10 апреля 2010

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

cls.__bases__

Из документов :

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

Пример:

>>> 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'>)
92 голосов
/ 10 апреля 2010

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

import inspect
print inspect.getmro(cls)

Полезно, что это дает вам все классы предков в «порядке разрешения методов», т. Е. В порядке, в котором будут проверяться предки при разрешении метода (или, фактически, любого другого атрибута - в нем живут методы и другие атрибуты) в конце концов, то же самое пространство имен в Python; -).

13 голосов
/ 10 апреля 2010

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

4 голосов
/ 30 января 2019

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

т.е. repr(YOUR_CLASS.__mro__)


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

выходов, IN ЗАКАЗ


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

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

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

3 голосов
/ 10 апреля 2010

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

2 голосов
/ 01 января 2019

Используйте базы, если вы просто хотите получить родителей, используйте __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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...