<p>正如@ch3ka已经指出的,dict在这里是pythonic的选择。
事情可能是这样的:</p>
<pre><code>class Categorizer(object):
'''Determines which category data is in.
There may be multiple variants of this class'''
def handleData(self, data, callback_mapping):
# get the category
category = self.categorize(data)
# invoke the corresponding handler
callback_mapping[category](data)
class IAmAReallyComplicatedBeast(object):
def __init__(self, categorizer, other_stuff):
self.categorizer = categorizer
# ...
# ... lots of other methods ...
def something(self, other_stuff):
data = self.obtain_data()
self.categorizer.handleData(data,
dict(mundane=self.doFoo,
special=self.doBar,
really_special=self.doBaz)
def doFoo(self, data):
# for mundane data
def doBar(self, data):
# for special data
def doBaz(self, data):
# for really special data
</code></pre>
<p>另一个经常使用的模式是为动态调用的方法创建名称。
例如,在python的内置函数中,调用<code>BaseHTTPServer</code><code>do_XXX</code>,其中<code>XXX</code>是请求HTTP方法的占位符:</p>
<pre><code> mname = 'do_' + self.command
if not hasattr(self, mname):
self.send_error(501, "Unsupported method (%r)" % self.command)
return
method = getattr(self, mname)
method()
</code></pre>
<p>见:<a href="https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py#l323" rel="nofollow">https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py#l323</a>
因此,您可以将方法命名为<code>doSpecial</code>、<code>doReallySpecial</code>和<code>doMundane</code>,并从分类程序中调用它们。你知道吗</p>