itersubclasses¶
- iteration_utilities.itersubclasses(cls, seen=None)¶
Iterate over the subclasses of cls. Recipe based on the snippet of Gabriel Genellina ([0]) but modified.
- Parameters:
- cls
type
The class for which to iterate over the subclasses.
- seenset, None, optional
Classes to exclude from iteration or
None
if all subclasses should be returned. Default isNone
.
- cls
- Returns:
- subclassesgenerator
The subclasses of cls.
References
Examples
It works with any class and also handles diamond inheritance structures:
>>> class A: pass >>> class B(A): pass >>> class C(B): pass >>> class D(C): pass >>> class E(C): pass >>> class F(D, E): pass >>> list(i.__name__ for i in itersubclasses(A)) ['B', 'C', 'D', 'F', 'E']
There is mostly no need to specify seen but this can be used to exclude the class and all subclasses for it:
>>> [i.__name__ for i in itersubclasses(A, seen={C})] ['B']
And it also works for objects subclassing
type
:>>> class Z(type): pass >>> class Y(Z): pass >>> [i.__name__ for i in itersubclasses(Z)] ['Y']
The reverse operation: To iterate over the superclasses is possible using the
class_to_test.__mro__
attribute:>>> [i.__name__ for i in F.__mro__] ['F', 'D', 'E', 'C', 'B', 'A', 'object']