类变量的Getter或Property函数

时间:2018-10-23 09:37:06

标签: python python-3.x class variables

您可以将@property装饰器用于实例变量,但可以对类变量执行类似的操作吗?

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

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

print(Config.baz)

但是,这不起作用。它返回<< strong>内置 .property对象>,而不是调用该函数的返回值。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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