Как я могу получить родительский класс (классы) класса Python?
Как получить родителей класса Python?
Ответ 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
просто затеняет область видимости. Честно говоря, это позор, что люди не знают просто использовать встроенные модули
Надеюсь, это поможет!