我正在尝试使用在运行时通过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()