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)
...