如何在基类中定义静态但动态的属性?

时间:2018-10-05 18:21:57

标签: python oop properties

我有一个基类和一些继承自它的子类。在这些子类上,我定义了一个静态属性。我想在基类中定义另一个静态属性,该静态属性的值基于子类的静态属性的值。

以下是我所指的玩具示例:

想象一下,我在某处定义了一些常量:

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属性以返回值?

我觉得解决方案是元类。

0 个答案:

没有答案