Как я могу получить родительский класс (ы) класса Python?
202
Используйте следующий атрибут:
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'>)
type(C()).__bases__
как указано нижеЕсли вы хотите, чтобы все предки, а не только непосредственные, использовали inspect.getmro :
Полезно, что это дает вам все классы предков в «порядке разрешения методов», т. Е. В порядке, в котором будут проверяться предки при разрешении метода (или, фактически, любого другого атрибута - методы и другие атрибуты живут в одном и том же пространстве имен). в конце концов, в Python ;-).
источник
cls.__mro__
(по крайней мере, в Python 3.5)У классов нового стиля есть метод mro, который вы можете вызвать, который возвращает список родительских классов в порядке разрешения методов.
источник
object
, похоже, не отвечаетmro
.x
, мы можем получить порядок разрешения метода с помощью вызова, которыйtype(x).mro()
мы можем рассмотреть, еслиx
имеетClassX
базовый класс с:ClassX in type(x).mro()
БЫСТРЫЙ путь, чтобы увидеть всех родителей, и ТОГО , просто используйте встроенный
__mro__
т.е.
repr(YOUR_CLASS.__mro__)
выходы, В ПОРЯДКЕ
Там у вас есть это. «Лучший» ответ на данный момент имеет 182 голоса (как я набираю это), но это НАСТОЛЬКО гораздо проще, чем некоторые замысловатые для цикла, изучая базы по одному классу за раз, не говоря уже о том, когда класс расширяет ДВА или более родительский классы. Импорт и использование
inspect
Излишне только облака. Честно говоря, это позор, люди не знают, просто использовать встроенные модулиНадеюсь, это поможет!
источник
inspect.getmro
просто вызывает__mro__
объект, как вы можете видеть в github.com/python/cpython/blob/… . Использованиеgetmro
дает более чистый и читаемый код. Хотя пропуск вызова функции действительно быстрее.Используйте базы, если вы просто хотите получить родителей, используйте
__mro__
(как указано @ naught101) для получения порядка разрешения методов (чтобы узнать, в каком порядке были выполнены инициалы).Основы (и сначала получение класса для существующего объекта):
Для mro в последних версиях Python:
Очевидно, что когда у вас уже есть определение класса, вы можете просто вызвать его
__mro__
напрямую:источник
Если вы хотите, чтобы все они были вызваны, используйте
super
на всех уровнях.источник