问题:
在类方法中使用 property() 函数@classmethod 装饰器会产生一个错误。
示例再现:
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
错误:
>>> 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
解决方案:
Python 3.8 及更高版本:
在 Python 3.8 及更高版本中,可以将 property() 函数与 @classmethod 修饰函数一起使用。只需将两个装饰器应用于方法即可。
Python 2 和 Python 3(也适用于 3.9-3.10)
在类上创建属性,但会影响实例。要创建类方法属性,请在元类上创建该属性。
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
以上是为什么在 Python 中使用'property()”和'@classmethod”修饰方法会导致错误?的详细内容。更多信息请关注PHP中文网其他相关文章!