[Tutor] classproperty: readonly and inheritance - not more needed

Peter Otten __peter__ at web.de
Sun Apr 23 15:03:10 EDT 2017


Thomas Güttler wrote:

> 
> 
> Am 20.04.2017 um 14:26 schrieb Steven D'Aprano:
>> On Thu, Apr 20, 2017 at 10:39:57AM +0200, Thomas Güttler wrote:
>>
>>>> - its hard to get classproperty to work right.
>>>
>>> What is "righ"?
>>>
>>> In my case a read-only classproperty is enough. Inheritance should be
>>> supported.
>>>
>>> I don't have a usecase for a setter.
>>
>> The standard library is not just for you :-)
>>
>> If Peter's solution is "good enough" for you, then great, go ahead and
>> use it. But beware: of the two implementations I know, you cannot have
>> both:
>>
>> - access from instances;
>> - read-only property;
>>
>> You can have access from instances, but then the classproperty is not
>> read-only. Or you can have read-only access, but only from the class
>> object.
> 
> I can't follow what you. What do you mean with "... is not read-only".
> 
> This snippet works fine:
> 
> {{{
> 
> class classproperty(object):
>      def __init__(self, f):
>          self.f = f
>      def __get__(self, obj, owner):
>          return self.f(owner)
> 
> class Foo(object):
>      @classproperty
>      def my_prop(cls):
>          return 42
> 
> print Foo.my_prop
> 
> print Foo().my_prop
> }}}
> 
> Regards,
>    Thomas
> 
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class classproperty(object):
...      def __init__(self, f):
...          self.f = f
...      def __get__(self, obj, owner):
...          return self.f(owner)
... 
>>> class Foo(object):
...      @classproperty
...      def my_prop(cls):
...          print "calculating..."
...          return 42
... 
>>> Foo.my_prop
calculating...
42

Now the "not read-only" part:

>>> Foo.my_prop = "whatever"
>>> Foo.my_prop
'whatever'

You now have a string attribute, the property is lost. Methods behave the 
same way and it's generally not a problem, but you should at least be aware 
of this behaviour.



More information about the Tutor mailing list