def Class(*base_classes): def add_base_class_attrs_to_inst(instance): for cls in base_classes: for name, attr in cls().__dict__.items(): if instance.__dict__.get(name) is None: instance.__dict__[name] = attr return instance def init_class(func): def wrapper(*args): instance = func(lambda: ..., *args) return add_base_class_attrs_to_inst(instance) return wrapper return init_class @Class() def BaseClass(self): def constructor(): self.test = test self.test2 = test2 return self def test(): print('A test') def test2(): print('A test2') return constructor() @Class() def BaseClass2(self): def constructor(): self.test3 = test3 return self def test3(): print('A test3') return constructor() @Class(BaseClass, BaseClass2) def user(self, x): def constructor(): self.x = x self.print_info = print_info self.test = test return self def print_info(self=self): print(f'x = {self.x}') def test(): print('Is override') return constructor() c = user(1) c2 = user(122) c.print_info() c2.print_info() c2.test() c2.test2() c2.test3()