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

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

DDD
发布: 2024-11-27 05:46:17
原创
532 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板