Ответы:
Используйте следующий атрибут:
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'>)
Если вы хотите, чтобы все предки, а не только непосредственные, использовали inspect.getmro :
import inspect
print inspect.getmro(cls)
Полезно, что это дает вам все классы предков в «порядке разрешения методов», т. Е. В порядке, в котором будут проверяться предки при разрешении метода (или, фактически, любого другого атрибута - методы и другие атрибуты живут в одном и том же пространстве имен). в конце концов, в 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__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
выходы, В ПОРЯДКЕ
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
Там у вас есть это. «Лучший» ответ на данный момент имеет 182 голоса (как я набираю это), но это НАСТОЛЬКО гораздо проще, чем некоторые замысловатые для цикла, изучая базы по одному классу за раз, не говоря уже о том, когда класс расширяет ДВА или более родительский классы. Импорт и использованиеinspect
Излишне только облака. Честно говоря, это позор, люди не знают, просто использовать встроенные модули
Надеюсь, это поможет!
inspect.getmro
просто вызывает __mro__
объект, как вы можете видеть в github.com/python/cpython/blob/… . Использование getmro
дает более чистый и читаемый код. Хотя пропуск вызова функции действительно быстрее.
Используйте базы, если вы просто хотите получить родителей, используйте __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)
Если вы хотите, чтобы все они были вызваны, используйте super
на всех уровнях.
type(C()).__bases__
как указано ниже