我遇到的情况是,我需要填充一个对象fillable_object,而我还有另一个对象fill_object用来填充第一个对象。但是,filler_object可以是不具有相同属性的不同类型。在这种情况下,我希望与fillable_object中的字段相关的字段的值为null。
我想到的是在尝试try块之外为fillable_object可以包含的每个类分组。由于不同类的属性集是互斥的,因此它们要么全部获取要么不获取,然后尝试下一个类型,等等。当前fillable_object可以容纳的类太多,但我认为这很烦人如果数量增加,以后再维护。
def fill_with(fillable, filler):
try:
fillable.attr1 = filler.attr1
except AttrError:
try:
fillable.attr2 = filler.attr2
fillable.attr3 = filler.attr3
except AttrError:
try:
#Continue for each class filler can be.
except AttrError:
return fillable
答案 0 :(得分:0)
是的,这绝对是代码的味道,您发现了原因:添加新的filler
对象时会发生什么?您必须重写函数。这违反了Open-closed principle。
软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改
具体地,您可以使用一些解决方法,但是您处于典型的“大开关”中,可以/应该用明智地使用多态来代替。
在您的示例中,filler
触发了异常:如果filler.attr1
不存在,则尝试下一个属性,依此类推。 filler
对象具有知识,因此应将fill_with
方法放入filler
。
class FillerA():
...
def fill(self, fillable):
fillable.attr1 = self.attr1
class FillerB():
...
def fill(self, fillable):
fillable.attr2 = self.attr2
fillable.attr3 = self.attr3
...
现在您的功能就是:
def fill_with(fillable, filler):
filler.fill(fillable)
该函数已关闭,无法修改,但是您可以通过添加新的filler
类型(使用方法fill
)来扩展它。奖励:filler
不再需要公开其属性。