@property; @classmethod; def f()

Ian Kelly ian.g.kelly at gmail.com
Sat Jan 1 21:42:09 EST 2011


On 1/1/2011 6:55 PM, K. Richard Pixley wrote:
> Can anyone explain to me why this doesn't work?
>> class Foo(object):
> @property
> @classmethod
> def f(cls):
> return 4
>> I mean, I think it seems to be syntactically clear what I'm trying to
> accomplish. What am I missing?

First, because classmethod returns a classmethod instance, not a 
function, so what gets passed to property is the classmethod descriptor, 
not an actual callable.
Second, because a property descriptor just returns itself when accessed 
on the class. It only works on instances.
To do what you want, I think you would need to write your own descriptor 
class. Something like this:
class classproperty(object):
 def __init__(self, getter):
 self._getter = getter
 def __get__(self, instance, owner):
 return self._getter(owner)
class Foo(object):
 @classproperty
 def f(cls):
 return 4
Modify as needed if you want to accomodate setters and deleters as well.
Cheers,
Ian


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /