我有一个基类和一些继承自它的子类。在这些子类上,我定义了一个静态属性。我想在基类中定义另一个静态属性,该静态属性的值基于子类的静态属性的值。
以下是我所指的玩具示例:
想象一下,我在某处定义了一些常量:
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
属性以返回值?
我觉得解决方案是元类。