使用通用工厂参数化python对象

时间:2017-11-21 18:22:58

标签: python oop design-patterns reflection factory

我正在尝试使用在运行时通过rest API提供的json字符串来参数化我的对象。我想出了以下设计。它工作,但我觉得使用类反射和setattr是糟糕的编程实践...但我不知道以我想要的完全通用的方式做任何其他方式(我希望能够扩展类中的具有新属性的未来,注册更多嵌套类等)

这是不是很糟糕,有更好的方法吗?

class Factory:
    contains = {}

    @staticmethod
    def subclass(this, args):
        klass = next((cls for cls in this.__class__.__subclasses__(this) if cls.__name__ == args.get('type', None)),
                            this.__class__)
        return klass()

    def __init__(self, d=None):
        for key, value in self.contains.items():
            args = d.get(key, None)
            child = self.subclass(value, args)
            setattr(self, key, child)

class Clock(Factory):
    def tick(self):
        print("base clock tick")

class DigitalClock(Clock):
    def tick(self):
        print("digital clock tick")

class House(Factory):
    contains = {'clock': Clock}
    def __init__(self, d):
        self.color = d.get('color','red')
        super().__init__(d)


H = House({'clock': {'type': "DigitalClock"}, 'color': 'blue'})
H.clock.tick()

0 个答案:

没有答案