首页 > 后端开发 > Python教程 > 为什么我不能在 Python 中将 `property()` 与类方法一起使用,解决方法是什么?

为什么我不能在 Python 中将 `property()` 与类方法一起使用,解决方法是什么?

DDD
发布: 2024-12-12 21:28:12
原创
231 人浏览过

Why Can't I Use `property()` with Classmethods in Python, and What Are the Workarounds?

将 property() 与 classmethod 结合使用:探索

在 Python 中,property() 函数在创建 getter 和 setter 方面起着至关重要的作用对于类属性。但是,尝试将 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)
登录后复制

当尝试访问或设置 Foo 类实例上的 var 属性时,我们遇到了错误:

>>> f = Foo()
>>> f.getvar()
5
>>> f.setvar(4)
>>> f.getvar()
4
>>> f.var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'classmethod' object is not callable
登录后复制

如文档和堆栈溢出讨论中所述[Python 类方法作为 Setter 和 Getter](https://stackoverflow.com/questions/27906399/python-class-method-as -setter-and-getter),在 Python 3.8 中不可能将 property() 函数与类方法一起使用

但是,还有其他方法可以实现所需的功能:

对于 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)
登录后复制

对于 3.9 及以上的 Python 版本:

更简洁的解决方案是将类方法移至元类并直接在元类上声明属性:

class Foo_meta(type):
    @property
    def var(cls):
        return cls._var

    @var.setter
    def var(cls, value):
        cls._var = value

class Foo(metaclass=Foo_meta):
    _var = 5
登录后复制

这些替代方法有效地允许使用类级别属性。

以上是为什么我不能在 Python 中将 `property()` 与类方法一起使用,解决方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

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