python - 类变量的 Getter 或 Property 函数

标签 python python-3.x class variables

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

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

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

打印(Config.baz)

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

最佳答案

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

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

关于python - 类变量的 Getter 或 Property 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52945814/

相关文章:

c++ - 为什么C++中同时存在struct和class?

ios - 类平等的单元测试

python - Pandas:转换数据框以显示原始数据框中是否存在值的组合

python - 迭代 Pandas 数据帧,同时跳过第一行

block 内的 python 异常处理

python - 为什么在Python类的__init__中使用self.foo = self.foo?

python - 从装饰器访问 django session

python2.7 : [SSL: UNKNOWN_PROTOCOL] unknown protocol

python - 使用 BeautifulSoup 检测 URL 并添加 anchor 标记

python - 类变量和实例变量有什么区别?