Alex Martelli wrote:Hmmm, you do realize that wrapdict uses a lot of indirection while my equivalent approach, just posted, is very direct, right? To reiterate the latter, and dress it up nicely too, it's
class wrapwell(object): def __init__(self, somedict): self.__dict__ = somedict
Bad mistake on my part, sorry!
Nick Coghlan wrote:
... a class that combined property access with the above...
In a similar vein to Nick's solution:
class AutoProperty(object):
def __init__(self, meth):
self.meth = meth
self.name = meth.__name__
self.__doc__ = meth.__doc__
def __get__(self, obj, cls):
if isinstance(obj, cls):
return obj.__dict__.setdefault(self.name, self.meth(obj))
else:
return self.__doc__
# You could define __set__ and __del__ but they don't seem
# necessary based on what you've said so far
class DataManipulator(object): def __init__(self, data): self.__dict__ = data
class Model(DataManipulator):
def z(self):
"""x+y"""
return self.x+self.y
z = AutoProperty(z) def z1(self):
"""Or any other useful information"""
return self.z + self.x
z1 = AutoProperty(z1)# You could automate these calls to AutoProperty in a metaclass
>>> a = {'x':1, 'y':2}
>>> b = {'x':3, 'y':3}
>>> d = Model(a)
>>> d.z
3
>>> d.z1
4
>>> a
{'y': 2, 'x': 1, 'z': 3, 'z1': 4}
>>> d= Model(b)
>>> d.z1
9
>>> b
{'y': 3, 'x': 3, 'z': 6, 'z1': 9}
>>>Michael
-- http://mail.python.org/mailman/listinfo/python-list
