import collections


def MetaNode(values):

    class Meta(type):

        def __new__(cls, name, bases, extra):

            class AbstractNode(collections.namedtuple(name, values)):

                def __new__(cls, *args, children=None, **kwargs):

                    return super().__new__(cls, *args, **kwargs)

                def __init__(self, *args, children=None, **kwargs):

                    super().__init__()
                    self.children = children or []

            return super().__new__(cls, name, bases + (AbstractNode,), extra)

    return Meta


class RootNode(metaclass=MetaNode("a b c")):

    pass
    
    
root = RootNode(1, 2, c=3)
print(root, root.children)

root = RootNode(1, 2, c=3, children=["yoba"])
print(root, root.children)