Late initialization using __getattribute__
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Thu Sep 4 13:57:01 EDT 2008
bukzor a écrit :
>>>>> so unfortunately I think I need to use __getattribute__
>>>>> to do this. I'm doing all this just to make the connection not
>>>>> actually connect until used.
>>>> I may be dumb, but I don't get how this is supposed to solve your
>>>> problem. But anyway : there's a known design pattern for what you're
>>>> trying to do, that doesn't require mixins nor messing with
>>>> __getattribute__ (which, I repeat, is more often than not something you
>>>> *don't* want to do). The name of the design pattern is "proxy". I
>>>> strongly suggest that you 1/ try to cure the real problem instead of
>>>> hacking around and 2/ read about the proxy design pattern.
>>>> My 2 cents...
>>> I like the idea of mix-ins, but can't figure out how to make a proxy
>>> work that way.
>> You mean, "how to use a proxy for lazy initialization" ? Heck, that's
>> the exact use case in the GoF.
>
> I mean, "how to make a MixIn class that uses the proxy pattern".
That's not how proxies work. They use composition/delegation, not MI.
>I'd
> like to be able to do something like this:
>
> class SuperCursor(FeatureOneMixIn, FeatureTwoMixin, ...,
> VanillaCursor): pass
Yuck.
Sorry, but it reminds me of the worst MI abuses in Zope2.
(snip)
> My toy example turned out to be not the best representation of the
> problem.
This is often the case with toy examples.
> The base class has attributes that "exist" but either throw errors or
> segfault
> if used before reconnect() is called.
Then these attributes should probably call reconnect() by themselves.
Decorators and/or computed attributes may help here.
More information about the Python-list
mailing list