[snip]I'm trying to create some read-only instance specific properties, but the following attempt didn't work:
class Foobar(object): pass
foobar = Foobar() foobar.x = property(fget=lambda: 42)
print "foobar.x:", foobar.x
Can anyone tell me what's wrong with this approach (and perhaps the correct way to do it, if there is one)?
Properties cannot be defined on a per-instance basis. Properties must be defined at the class level. So you need to do something like:
py> class Foobar(object): ... x = property(fget=lambda self: 42) ... py> Foobar().x 42
or
py> class Foobar(object): ... pass ... py> Foobar.x = property(fget=lambda self: 42) py> Foobar().x 42
If you want to have different properties on different instances, you'll need to make each of the different instances a different subtype of Foobar, e.g.:
py> class Foobar(object): ... pass ... py> foobar = type('FoobarSub', (Foobar,), ... dict(x=property(fget=lambda self: 42)))() py> foobar.x 42 py> Foobar().x Traceback (most recent call last): File "<interactive input>", line 1, in ? AttributeError: 'Foobar' object has no attribute 'x'
What's the situation in which you think you want different properties for different instances of the same class?
STeVe -- http://mail.python.org/mailman/listinfo/python-list