Emanuele D'Arrigo wrote: > Greetings, > > today I did something like this: > > class MyClass(object): > > @classmethod > def myClassMethod(self): > print "ham" > > myProperty = property(myClassMethod, None, None) > > As many of you know this doesn't work and returns a TypeError: the > object passed to the property is not a callable function but a > classmethod object, which isn't callable at all.
That code runs fine for me. Although I doubt the behavior is what you wanted to do. > So, how do I do this? > Ultimately all I want is a non-callable class-level attribute > MyClass.myProperty that gives the result of MyClass.myClassMethod(). This works like what you seem to want (it's ugly): class MyClass(object): class _MyClass(object): @classmethod def myClassMethod(cls): return 'ham' @property def myProperty(self): return MyClass._MyClass.myClassMethod() @classmethod def myClassMethod(cls): return MyClass._MyClass.myClassMethod() @property def myProperty(self): return MyClass._MyClass.myClassMethod() def __call__(self, *args, **kargs): # this is __init__ return MyClass._MyClass(*args, **kargs) # note this is NOT a real MyClass instantiation MyClass = MyClass() $ python -i ./strangeclass.py >>> MyClass.myClassMethod() 'ham' >>> MyClass.myProperty 'ham' >>> mc = MyClass() >>> mc.myProperty 'ham' >>> mc.myClassMethod() 'ham' -- http://mail.python.org/mailman/listinfo/python-list