class Class1(object):
...
class Class2(object):
...
class Class3(object):
...
class A(object):
def _methA(parm1, parm2)
...
def _methB(parm1, parm2)
...
def _methC(parm1, parm2)
...
def manager(parm1, method, params)
...
if parm1.__class__.__name__==Class1.__name__:
response = _methA(parm1, params)
elif parm1.__class__.__name__==Class2.__name__:
response = _methB(parm1, params)
elif io_source.__class__.__name__==Class3.__name__:
response = _methC(parm1, params)
else:
raise Exception, "Unsupported parm1"
...
我不喜歡的方式,在manager()
if/elif
塊看着它重構爲這樣:上調用A類的方法取決於類型參數的
def manager(parm1, method, params)
...
try:
response = {
Class1.__name__: lambda parm1, parms: _methA(parm1, parms),
Class2.__name__: lambda parm1, parms: _methB(parm1, parms),
Class3.__name__: lambda parm1, parms: _methC(parm1, parms)
}[parm1.__class__.__name__](parm1, parms)
except KeyError:
raise Exception, "Unsupported parm1"
但事實證明代碼仍然在看類名困擾我 - 我真的不知道如何解釋爲什麼... 它應該打擾我嗎?
有沒有更好的方式來編寫代碼來調用A類的方法是,根據類的參數之一,觸發在不同的方法的調用?
PS。對不起這個人爲的例子,但發佈實際的代碼會讓問題變得更加複雜。我想這個問題要提煉其精髓...
+1:這是最小的一段代碼的一個很好的例子顯示問題。 – 2009-12-18 15:41:09