我有一个带有两个类方法(使用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()函数与类方法修饰的函数一起使用?
阅读Python 2.2 release注释,我发现以下内容。
注意:下面的方法实际上不适用于setter,只适用于getter。
因此,我认为指定的解决方案是创建一个类属性作为属性的子类。
然而,设置器实际上并不起作用:
foo._var
没有改变,您只是用一个新值覆盖了属性。您还可以使用
ClassProperty
作为装饰:属性是在类上创建的,但会影响实例。因此,如果需要classmethod属性,请在元类上创建该属性。
但是既然你使用的是一个元类,如果你把类方法移到其中,它会读得更好。
或者,使用Python 3的
metaclass=...
语法,以及在foo
类主体外部定义的元类,以及负责设置_var
初始值的元类:我希望这个死板的简单只读
@classproperty
装饰器能够帮助人们寻找类属性。相关问题 更多 >
编程相关推荐