Отражение суперкласса Python

Если у меня есть код Python

class A(): pass class B(): pass class C(A, B): pass 

и у меня есть класс C , есть ли способ итерации через суперкласс ( A и B )? Что-то вроде псевдокода:

 >>> magicGetSuperClasses(C) (<type 'A'>, <type 'B'>) 

Одним из решений является проверка модуля и функции getclasstree .

 def magicGetSuperClasses(cls): return [o[0] for o in inspect.getclasstree([cls]) if type(o[0]) == type] 

но является ли это «питоническим» способом достижения цели?

  • История задач сельдерея
  • Django: как подсчитать количество просмотренных людей
  • Как определить, относится ли число к определенному диапазону в Python?
  • ImportError: невозможно импортировать имя
  • Оценка размера zip / времени создания
  • Восход / набор расчетов
  • Почему мой генератор блокирует Flask от отправки ответов SSE?
  • Когда использовать возврат (что-то вывести)?
  • 4 Solutions collect form web for “Отражение суперкласса Python”

    C.__bases__ – массив суперклассов, поэтому вы можете реализовать свою гипотетическую функцию следующим образом:

     def magicGetSuperClasses(cls): return cls.__bases__ 

    Но я полагаю, что в большинстве случаев было бы проще просто ссылаться на cls.__bases__ .

    @John: ваш фрагмент не работает – вы возвращаете класс базовых классов (которые также называются метаклассами). Вы действительно просто хотите cls.__bases__ :

     class A: pass class B: pass class C(A, B): pass c = C() # Instance assert C.__bases__ == (A, B) # Works assert c.__class__.__bases__ == (A, B) # Works def magicGetSuperClasses(clz): return tuple([base.__class__ for base in clz.__bases__]) assert magicGetSuperClasses(C) == (A, B) # Fails 

    Кроме того, если вы используете Python 2.4+, вы можете использовать выражения генератора вместо создания списка (через []), а затем превратить его в кортеж (через tuple ). Например:

     def get_base_metaclasses(cls): """Returns the metaclass of all the base classes of cls.""" return tuple(base.__class__ for base in clz.__bases__) 

    Это несколько запутанный пример, но genexps, как правило, легкие и прохладные. 🙂

    Модуль проверки был хорошим началом, используйте функцию getmro :

    Возвращает кортеж базовых классов cls класса, включая cls, в порядке разрешения метода. В этом корте нет более одного раза. …

     >>> class A: pass >>> class B: pass >>> class C(A, B): pass >>> import inspect >>> inspect.getmro(C)[1:] (<class __main__.A at 0x8c59f2c>, <class __main__.B at 0x8c59f5c>) 

    Первым элементом возвращаемого кортежа является C , вы можете просто игнорировать его.

    если вам нужно знать на заказ, в котором super () будет вызывать классы, вы можете использовать C.__mro__ и не нуждаетесь в inspect .

    Python - лучший язык программирования в мире.