Perl vs. Python question...
Lloyd Kvam
python at venix.com
Tue Jul 14 11:08:15 EDT 2009
On Mon, 2009-07-13 at 22:59 -0400, Paul Lussier wrote:
> Lloyd Kvam <python at venix.com> writes:
>
> > You've already gotten two useful responses. I'd just like to add that
> > typically, the object attributes are referenced directly:
> > rect.length * rect.width
>
> Lloyd, thanks. But what if the attribute isn't set yet? If I have
> self.foo, and self.foo hasn't yet been set, I want it to go and get set,
> then return the correct value.
If the initial set value is a simple constant, make it a class attribute
with the default value. The object can override the attribute with a
different value when that value is determined.
>
> I get the impression the __getattr__() method helps here,
If the value will be computed on demand, __getattr__ is one way to go.
def __getattr__(self, attr):
if attr == 'foo':
return self.compute_foo()
elif ....
else:
raise AttributeError( attr + ' is invalid name')
This is the 'traditional' approach. __getattr__ is *only* called when
an attribute is not found. If you wanted to save the computed value, so
that __getattr__ was no longer used:
self.__dict__['foo'] = self.compute_foo()
return self.foo
The simplistic self.foo = self.compute_foo() will trigger a call to
__getattr__, so you can't use that within __getattr__.
The new-style python classes allow for cleaner dispatching of your
attribute computations using properties, but for a small number of
names, __getattr__ will do just fine. If there is no setter method and
foo is always computed, your class could be coded:
foo = property( compute_foo)
> I just don't
> quite get it yet.
HTH
>
> --
> Thanks,
> Paul
--
Lloyd Kvam
Venix Corp
DLSLUG/GNHLUG library
http://dlslug.org/library.html
http://www.librarything.com/catalog/dlslug
http://www.librarything.com/rsshtml/recent/dlslug
http://www.librarything.com/rss/recent/dlslug
More information about the gnhlug-discuss
mailing list