Bob B. a écrit : > I've been playing with descriptors lately. I'm having one problem I > can't seem to find the answer to. I want to assign a descriptor to a > list of attributes. I know I should be able to add these somewhere in > the class's __dict__, but I can't figure out where. Here's some code: > > class MyDesc(object): > def __init__(self, name=None, initVal=None): > self.name = name > self.value = initVal > > def __get__(self, obj, objtype): > // Do some stuff > self.value = "blah" > return self.value > > class MyClass(object): > attributes = ('attr1', 'attr2') > for attr in attributes: > exec ("%s=MyDesc('%s')") % (attr, attr) > > // More stuff in the class > > Ok, that "exec" is an ugly hack. There's gotta be someway to plop > this straight into the class's __dict__ without doing that, but when I > try adding self.__class__.__dict__[attr] = MyDesc(attr) in MyClass's > __init__ method, I get the error: "TypeError: 'dictproxy' object does > not support item assignment" > > Any ideas?
Steven already show you the simplest solution. Now if you want something "cleaner" (or at least more transparent to persons subclassing MyClass - which may or may not be a concern), you can use metaclasses too: class MyDesc(object): def __init__(self, name=None, initVal=None): self.name = name self.value = initVal def __get__(self, obj, objtype): # Do some stuff #self.value = "blah" if obj is None: return self return self.value class MyType(type): def __init__(cls, name, bases, dic): attributes = dic.get('attributes', None) if attributes is not None: for attrname, initval in attributes.iteritems(): setattr(cls, attrname, MyDesc(attrname, initval)) class MyClass(object): __metaclass__ = MyType attributes = dict(attr1="attr1", attr2="attr2") class MySubclass(MyClass): # let you override parent's attributes... attributes = dict(attr1="otherattr1", attr3="a new one") HTH -- http://mail.python.org/mailman/listinfo/python-list