michael wrote:[color=blue]
> My first try is :
>
> fget = lambda self: mygetattr(self, attrname)
> fset = lambda self, value: mysetattr (self, attrname, value)
> fdel = lambda self: mydelattr(self, attrname)
>
> # fget, fset, fdel are used to reconstruct the byte field
>
> setattr (self, key, property (fget, fset, fdel))[/color]
setattr creates entries in the instance dictionary of the object that is passed
in. Properties need to be stored in the object type's dictionary in order to
work their magic. I also believe it is required that the class be a new-style class.
So try something like (Python 2.4):
Py> def mygetattr(self, attr):
.... print "Getting %s from %s" % (str(attr), str(self))
....
Py> def mysetattr(self, attr, value):
.... print "Setting %s to %s on %s" % (str(attr), str(value), str(self))
....
Py> def mydelattr(self, attr):
.... print "Deleting %s from %s" % (str(attr), str(self))
....
Py> class C(object):
.... @classmethod
.... def make_properties(cls, attrs):
.... for attr in attrs:
.... # Use default arguments to bind attr *now*, not at call time
.... def _get(self, attr=attr):
.... return mygetattr(self, attr)
.... def _set(self, value, attr=attr):
.... mysetattr(self, attr, value)
.... def _del(self, attr=attr):
.... mydelattr(self, attr)
.... setattr(cls, attr, property(_get, _set, _del))
....
Py> properties = ["x", "y"]
Py> C.make_properties(properties)
Py> C.x
<property object at 0x00A9D3F0>
Py> c = C()
Py> c.x
Getting x from <__main__.C object at 0x00A9A990>
Py> c.x = 1
Setting x to 1 on <__main__.C object at 0x00A9A990>
Py> del c.x
Deleting x from <__main__.C object at 0x00A9A990>
Py> c.y
Getting y from <__main__.C object at 0x00A9A990>
Py> c.y = 1
Setting y to 1 on <__main__.C object at 0x00A9A990>
Py> del c.y
Deleting y from <__main__.C object at 0x00A9A990>
The decorator syntax is the only 2.4'ism I'm aware of in that code, so porting
to 2.3 or even 2.2 shouldn't be an issue.
Cheers,
Nick.
--
Nick Coghlan |
ncoghlan@email.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.skystorm.net