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