在类方法上使用 property()
在类方法上直接使用 property() 不会按预期工作,因为 property() 期望的是实例方法而不是类方法。然而,我们可以创建一个自定义的描述器来实现这一点。下面是一个示例,演示了如何在类方法上使用 property():
property()
class ClassProperty: def __init__(self, fget=None, fset=None): self.fget = fget self.fset = fset def __get__(self, instance, owner): if self.fget is None: raise AttributeError("unreadable attribute") return self.fget(owner) def __set__(self, instance, value): if self.fset is None: raise AttributeError("can't set attribute") self.fset(instance.__class__, value) def getter(self, fget): self.fget = fget return self def setter(self, fset): self.fset = fset return self class Foo(object): _var = 5 @ClassProperty @classmethod def var(cls): return cls._var @var.setter @classmethod def var(cls, value): cls._var = value # 测试类级别属性 print(Foo.var) # 输出: 5 Foo.var = 4 print(Foo.var) # 输出: 4 # 实例访问也应该可以工作 f = Foo() print(f.var) # 输出: 4 f.var = 6 print(f.var) # 输出: 6 print(Foo.var) # 输出: 6
在这个例子中:
ClassProperty
var
@ClassProperty
@classmethod
@var.setter
这样,你就可以在类方法上使用 property() 的功能,并实现类级别的属性。