我有一个情况,我得到一个对象,我需要填充的可填充对象,还有另一个对象,填充对象,我用来填充第一个对象。但是,filler\u对象可以是不同类型的,但属性不同。在这种情况下,我希望与fillable\u对象中的字段相关的字段得到null值。你知道吗
我想到的是在try except块中为每个可填充的\u对象可以是的类分组。由于不同类的属性集是互斥的,它要么获取所有的属性集,要么获取非属性集,然后尝试下一个类型等。目前filleble\u 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
是的,这肯定是一种代码味道,您发现了原因:添加新的
filler
对象时会发生什么?你必须重写你的函数。这违反了Open-closed principle。你知道吗具体地说,您可以使用一些变通方法,但是您正处于一个典型的“大切换”中,可以/应该被多态性的明智使用所取代。你知道吗
在您的示例中,触发异常的是
filler
:如果filler.attr1
不存在,则尝试下一个属性,依此类推。filler
对象具有知识,因此应该将fill_with
方法放在filler
中。你知道吗现在你的功能是:
此函数已关闭以进行修改,但您可以通过添加新的
filler
类型来扩展它(使用方法fill
)。奖励:filler
不再需要暴露他的属性。你知道吗相关问题 更多 >
编程相关推荐