You can let each class maintain its own list of instances by providing each with its own _registry class _registry . Then, instead of checking if each instance has a specific class, you can instead _registry over all the values ββin _registry for each subclass of cls . To find these subclasses, you can use the cls.__subclasses__() method:
import itertools as IT class IterPartRegistry(type): def __init__(cls, name, bases, attrs): super(IterPartRegistry, cls).__init__(name, bases, attrs) cls._registry = [] def __iter__(cls): yield from cls._registry for subcls in cls.__subclasses__(): yield from subcls class A(object, metaclass=IterPartRegistry): def __init__(self, name): self.name = name self._registry.append(self) class B(A): pass class C(A): pass class D(B, C): pass A("A - first") B("B - first") B("B - second") C("C - first") D("D - first") for t in A: print(t.name) print(" --- ") for t in B: print(t.name)
gives
A - first B - first B - second D - first C - first D - first --- B - first B - second D - first
source share