Implicit initialisation of inherited attributes

I’ve implemented a metaclass that achieves your syntax:

import inspect

class ImplicitParentInitMeta(type):
    def __call__(cls, **kwargs):
        self = object.__new__(cls)
        for cls_ in cls.__mro__:
            if isinstance(cls_, ImplicitParentInitMeta):
                sig = inspect.signature(cls_.__init__)
                kw = {n: kwargs[n] for n in sig.parameters if n in kwargs}
                cls_.__init__(self, **kw)
        return self

class A(metaclass=ImplicitParentInitMeta):
    def __init__(self, a):
        print("A", a)

class B(A, metaclass=ImplicitParentInitMeta):
    def __init__(self, b):
        print("B", b)

...
1 Like