On 2 July 2016 at 14:54, Mike Bayer <[email protected]> wrote: > > > On 07/02/2016 07:46 AM, Jonathan Underwood wrote: >> >> Hi, >> >> As documented, the default constructor for objects that inherit from >> Base doesn't work in multiple inheritance situations (unless Base is >> last in the list of classes, I suppose). It wouldn't be too difficult to >> change this without breaking existing expectations, I believe. Something >> like this: >> >> def _declarative_constructor(self, **kwargs): >> """A simple constructor that allows initialization from kwargs. Sets >> attributes on the constructed instance using the names and values >> in ``kwargs``. >> >> Differs from the default constructor in that (a) keys not present >> in the attributes of the instance's class are ignored; (b) we call >> super at the end to ensure proper multiple inheritance behaviour. >> >> """ >> cls_ = type(self) >> unused_kwargs = dict() >> for k in kwargs: >> if hasattr(cls_, k): >> setattr(self, k, kwargs[k]) >> else: >> unused_kwargs.update({k:kwargs[k]}) >> >> super(Base, self).__init__(**unused_kwargs) > > > Well, all existing tests would have to pass, but also I wonder where are you > getting "Base" above? It's not present and would have to be passed to an > enclosing function that generates a _declarative_constructor as a closure. > That would imply a change in the API of the declarative_base function, which > accepts a constructor function as an argument, to now accept a > constructor-generating function.
Yes, I had this thought too, after sending the earlier email. Having thought about it, I can't immediately see an easy way to establish the name of the generated declarative_base class without the API change you describe (which I assume you'd be opposed to). This is a shame, as it would be nice not to break multiple inheritance, but I really can't see a good general fix. Cheers, Jonathan. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
