Getters and Setters
Neil Schemenauer
nascheme at ucalgary.ca
Thu Jul 15 04:58:59 EDT 1999
Andrew Dalke <dalke at bioreason.com> wrote:
>Here's one optimization, don't recreate getter/setter objects.
If you don't recreate the objects you end of with reference
loops. I don't see any way around this.
There is another problem with your optimizations. What happens
if the value of the attribute changes? My second version had
this problem too. Also, what if someone holds a reference to the
method and calls it periodicly? This is the best I can do:
class _Getter:
def __init__(self, dict, name):
self.dict = dict
self.name = name
def __call__(self):
return self.dict[self.name]
class _Setter:
def __init__(self, dict, name):
self.dict = dict
self.name = name
def __call__(self, value):
self.dict.__dict__[self.name] = value
class GetterSetter:
def __getattr__(self, name):
try:
if name[:3] == 'get':
return _Getter(self.__dict__, name[3:])
elif name[:3] == 'set':
return _Setter(self, name[3:])
except KeyError:
pass
raise AttributeError
Using lambda instead of __call__ gives a small speed increase
but, ask you point out, changes the symantics.
Neil
More information about the Python-list
mailing list