【问题标题】:Getter or Property function for Class Variables类变量的 Getter 或 Property 函数
【发布时间】:2019-03-27 12:00:59
【问题描述】:

您可以将@property 装饰器用于实例变量,但您可以为类变量做类似的事情吗?

我有一个带有配置参数的Config 类,但是我现在需要一些配置变量,它们是其他类变量的函数。例如,

class Config:
    foo = 1
    bar = 2
    @property
    def baz():
        return self.foo + 2*self.bar

print(Config.baz)

但这不起作用。它返回 builtin.property object> 而不是调用函数的返回值。有什么建议吗?

【问题讨论】:

  • 你不想要return self.foo + 2*self.bar吗?
  • @DanGamble 是的,我想,但这不是问题所在。如果您尝试 Config.baz 它返回 <__builtin__.property object> 而不是调用函数的返回值。
  • 我认为这必须是静态方法,它在没有实例化类的情况下被调用。

标签: python python-3.x class variables


【解决方案1】:

当然可以,但是就像必须在类上定义属性才能在实例上使用它一样,您必须在元类上定义一个属性才能直接在类本身上使用它:

class ConfigType(type):
    @property
    def baz(cls):
        return cls.foo + 2*cls.bar

class Config(metaclass=ConfigType):
    foo = 1
    bar = 2

print(Config.baz)

将打印5

当您这样做时,该属性将在实例上完全不可见,仅在类上可见,但您可以在两个地方定义它,并且两个定义不会干扰:

class ConfigType(type):
    @property
    def baz(cls):
        return cls.foo + 2*cls.bar

class Config(metaclass=ConfigType):
    foo = 1
    bar = 2

    @property
    def baz(self):
        return self.foo + 2*self.bar

config = Config()
config.foo = 3
print(Config.baz, config.baz)

打印5 7

【讨论】:

  • 太棒了!你每天学习新的东西!感谢和简洁的推理。我已经在想这不可能了哈哈。
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多