gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:25:09 25 4
gpt4 key购买 nike

我有一个具有两个类方法(使用 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 < python <3.11

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

Python < 3.9

属性是在类上创建的,但会影响实例。因此,如果您想要一个 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

关于python - 在类方法上使用 property(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/128573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com