python - 在类方法上使用 property()

我有一个具有两个类方法(使用 classmethod() 函数)的类,用于获取和设置本质上是静态变量的内容。我尝试将 property() 函数与这些一起使用,但会导致错误。我能够在解释器中使用以下内容重现错误:

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

是否可以将 property() 函数与 @classmethod 修饰函数一起使用?

最佳答案

3.8

可以同时使用两个装饰器。见 this answer .

Python

属性是在类上创建的,但会影响实例。因此,如果您想要一个 classmethod 属性,请在元类上创建该属性。

>>> 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

但是由于您无论如何都在使用元类,因此如果您将类方法移到那里会更好。

>>> class foo(object):
...     _var = 5
...     class __metaclass__(type):  # Python 2 syntax for metaclasses
...         @property
...         def var(cls):
...             return cls._var
...         @var.setter
...         def var(cls, value):
...             cls._var = value
... 
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3

或者,使用 Python 3 的 metaclass=... 语法,以及在 foo 类主体之外定义的元类,以及负责设置初始值的元类_var:

>>> class foo_meta(type):
...     def __init__(cls, *args, **kwargs):
...         cls._var = 5
...     @property
...     def var(cls):
...         return cls._var
...     @var.setter
...     def var(cls, value):
...         cls._var = value
...
>>> class foo(metaclass=foo_meta):
...     pass
...
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3

https://stackoverflow.com/questions/128573/

相关文章:

python - 为什么 (1 in [1,0] == True) 评估为 False?

linux - 并排显示两个文件

linux - 安装 Jenkins 后无法 su 到用户 jenkins

linux - 错误 : Can't open display: (null) when using

c - 如何设置 cron 作业以每小时运行一次可执行文件?

python - 使用字典计算列表中的项目

python - 在pytest中,conftest.py文件有什么用?

linux - 如何通过命令行将图像转换为灰度?

python - 定义Python源代码编码的正确方法

python - 是否可以将已编译的 .pyc 文件反编译为 .py 文件?