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

Reply via email to