首页 >后端开发 >Python教程 >为什么在 Python 中使用'property()”和'@classmethod”修饰方法会导致错误?

为什么在 Python 中使用'property()”和'@classmethod”修饰方法会导致错误?

DDD
DDD原创
2024-11-27 05:46:17523浏览

Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?

在类方法中使用 property()

问题:

在类方法中使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn