Функция получения или свойства для переменных класса - PullRequest
0 голосов
/ 23 октября 2018

Вы можете использовать декоратор @property для переменных экземпляра, но можете ли вы сделать что-то подобное для переменных класса?

У меня есть класс Config с параметрами конфигурации, однако теперь мне нужны некоторые переменные конфигурации, которыефункции других переменных класса.Например,

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

print(Config.baz)

Это, однако, не работает.Он возвращает <<strong> встроенный .property object> вместо возвращаемого значения от вызова функции.Есть предложения?

1 Ответ

0 голосов
/ 23 октября 2018

Конечно, вы можете, но так же, как свойство должно быть определено в классе, чтобы использовать его в экземпляре, вы должны определить свойство в метаклассе, чтобы иметь возможность использовать его непосредственно в самом классе:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...