У меня есть базовый класс и некоторые подклассы, которые наследуются от него.На этих подклассах я определяю статическое свойство.Я хотел бы определить другое статическое свойство в базовом классе, значение которого основано на значении статического свойства подкласса.
Вот забавный пример того, на что я ссылаюсь:
Представьте себеУ меня есть несколько констант, определенных где-то:
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
, чтобы вернуть значение?
У меня такое ощущение, что решение - метаклассы.