Home >Backend Development >Python Tutorial >Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?
Problem:
Using the property() function with class methods decorated with the @classmethod decorator results in an error.
Example Reproduction:
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
Error:
>>> f = Foo() >>> f.getvar() 5 >>> f.setvar(4) >>> f.getvar() 4 >>> f.var Traceback (most recent call last): File <stdin>, line 1, in ? TypeError: 'classmethod' object is not callable >>> f.var=5 Traceback (most recent call last): File <stdin>, line 1, in ? TypeError: 'classmethod' object is not callable
Solution:
Python 3.8 and Later:
In Python 3.8 and later, it is possible to use the property() function with @classmethod decorated functions. Simply apply both decorators to the method.
Python 2 and Python 3 (Works in 3.9-3.10 too)
A property is created on a class but affects an instance. To create a classmethod property, create the property on the metaclass.
class foo(object): _var = 5 class __metaclass__(type): # Python 2 syntax for metaclasses pass @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func) >>> foo.var 5 >>> foo.var = 3 >>> foo.var 3
The above is the detailed content of Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?. For more information, please follow other related articles on the PHP Chinese website!