The error message is telling you the truth: you are providing multiple
values for the keyword argument 'a'.
You're calling :
self.__class__(self, **virtual_init_args)
which will generate a new instance of self.__class__, and call
__init__ on it as a bound method; with self already implicitly
referenced. What you're doing is equivalent to invoking:
Base(self, a=x, b=y, c=z)
but the signature of the Base.__init__ is
Base(a, b, c)
So you're assigning "self" to a (the first argument of the bound
method) and then also providing "a" in virtual_init_args.
----
Removing the self-as-first argument does what you're trying to do -
but immediately drops you into an infinite loop. This is not
surprising, because now you've got cls.__init__ calling itself
directly, with no termination condition on the recursion.
----
I can't really tell you how to fix it without knowing more about what
you're actually trying to do.
I'd guess you maybe want to be looking at overriding __new__ somehow
as well, but without further details I don't know.
Toby