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