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, valueclass 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
