Late initialization using __getattribute__
Carl Banks
pavlovevidence at gmail.com
Thu Sep 4 15:19:28 EDT 2008
On Sep 4, 12:36 pm, bukzor <workithar... at gmail.com> wrote:
> > >>> 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".
You don't. That's not how proxies work.
> I'd like to be able to do something like this:
>
> class SuperCursor(FeatureOneMixIn, FeatureTwoMixin, ...,
> VanillaCursor): pass
Why does it have to look like that? A good programmer lets the code
look however it has to look to most effectively do it's job.
With a proxy, the "base class" isn't a base class but a member. Here
is a very simple example:
class SuperCursor(object):
def __init__(self):
self._cursor = VanillaCursor()
self._connected = False
def __getattr__(self,attr):
if not self._connected:
self._cursor.connect()
self._connected = True
return getattr(self._cursor,attr)
cursor = SuperCursor()
That doens't use a mixin, but why should it?
Carl Banks
More information about the Python-list
mailing list