Martin Miller wrote:
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

[snip]

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

Reply via email to