import inspect class A(): def __init__(self): self.stack = inspect.stack() self.children = [] def add_child(self, cls): child = cls() self.children.append(child) return child class B(A): pass class C(A): pass node_classes = [A, B, C] def load_nodes(N): root = A() for i in range(N): child_i = root.add_child(node_classes[i%len(node_classes)]) for j in range(N): child_j = child_i.add_child(node_classes[(i*j)%len(node_classes)]) load_nodes(20)