@ Джон: Ваш фрагмент не работает - вы возвращаете класс базовых классов (которые также называются метаклассами). Вы действительно просто хотите 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 обычно просты и круты. :)