David S. wrote:


This still fails to work for instances variables of the class. That is if I use your property in the following:
py> ...class Flags(object):
... def __init__(self): ... a = singlechar
...

you should write that as: class Flags(object): a = singlechar def __init__(self): a = "a"


py> f = Flags()
py> f.a = "a"

Now f.a.__class__.__name__ returns 'str'. So the property was not used at all.

Also, it seems that using a property, I can not do the other useful things I can do with a proper class, like provide an __init__, __str__, or __repr__.

If you want "other useful things" then you can write a custom descriptor, like:

from weakref import WeakKeyDictionary

class SingleChar(object):
    def __init__(self):
        """raises ValueError if attribute is set to something
        other than a single char"""
        self.objdict = WeakKeyDictionary()
    def __get__(self, obj, cls):
        if isinstance(obj, cls):
            try:
                return self.objdict[obj]
            except KeyError:
                raise AttributeError, "property not set"
        else:
            return self
    def __set__(self, obj, value):
        if isinstance(value, str) and len(value) == 1:
            self.objdict[obj] = value
        else:
            raise ValueError, value

class Flags(object):
    a = SingleChar()
    b = SingleChar()


See also: http://groups-beta.google.com/group/comp.lang.python/msg/30c61a30a90133d2

for another example of this approach

Michael
Again, thanks,
David S.



-- http://mail.python.org/mailman/listinfo/python-list

Reply via email to