Как определить статическое и в то же время динамическое свойство в базовом классе? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть базовый класс и некоторые подклассы, которые наследуются от него.На этих подклассах я определяю статическое свойство.Я хотел бы определить другое статическое свойство в базовом классе, значение которого основано на значении статического свойства подкласса.

Вот забавный пример того, на что я ссылаюсь:

Представьте себеУ меня есть несколько констант, определенных где-то:

SERVICE_ID_TACO_BELL = 1
SERVICE_ID_T_MOBILE = 2
SERVICE_NAMES = {
    SERVICE_ID_TACO_BELL: "Taco Bell",
    SERVICE_ID_T_MOBILE: "T-Mobile",
}

И затем я хочу определить свой базовый класс и некоторые подклассы:

class BaseService(object):
    service_id = None

    @classmethod
    def get_service_name(cls):
        return SERVICE_NAMES.get(cls.service_id)


class TacoBell(BaseService):
    service_id = SERVICE_ID_TACO_BELL

Прямо сейчас мы можем сделать это:

assert TacoBell.service_id == SERVICE_ID_TACO_BELL
assert TacoBell.get_service_name() == "Taco Bell"

Цель состоит в том, чтобы быть в состоянии сделать это:

assert TacoBell.service_name == "Taco Bell"

Мы можем сделать что-то вроде этого после факта:

setattr(TacoBell, 'service_name', TacoBell.get_service_name())

но это кажется грязным

Как мы можем добавить статическое, но динамическое свойство к BaseService, которое сравнивает свойство service_id подкласса с SERVICE_NAMES, чтобы вернуть значение?

У меня такое ощущение, что решение - метаклассы.

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