Steven D'Aprano wrote:

> As I said, I haven't had a chance to try Peter's code, so it's possible
> that he's solved all these problems. I'm judging by previous

No, my simple code only "works" for read-only properties and only as long as 
you don't overwrite the property by assigning to the attribute. To disallow 
writing you can define a

def __set__(*args):
    raise AttributeError

method, but that would only be invoked for instances of the class, not the 
class itself. For the same reason the setter of a read/write class property 
following that design would only be invoked in an instance, not in the 
class.

The other simple solution, defining a normal property in the metaclass,
works for the class (as expected, remember that the class is an instance of 
the metaclass), but is invisible to the instance:

>>> class T(type):
...     @property
...     def foo(self): return 42
... 
>>> class Foo:
...     __metaclass__ = T
... 
>>> Foo.foo
42
>>> Foo.foo = "bar"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>> Foo().foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'foo'


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to