<p>我遍历了一个列表,并希望对每个项调用一个函数,但是这个函数应该是可替换的。你知道吗</p>
<p>例如,我有以下脚本:</p>
<pre><code>class Parent(object):
def a(self, text):
raise NotImplementedError("called Parent.a")
def b(self, text):
raise NotImplementedError("called Parent.b")
class ChildA(Parent):
def a(self, text):
return "A.a: {}".format(text)
def b(self, text):
return "A.b: {}".format(text)
class ChildB(Parent):
def a(self, text):
return "B.a: {}".format(text)
def b(self, text):
return "B.b: {}".format(text)
# the separation is ONLY so that the first exec_all doesn't fail
# in my production code it's a list of mixed instances
children = [
ChildA(), # obviously here might be several different ChildA instances
]
childrenMixed = children + [
ChildB(), # obviously here might be several different ChildB instances
]
def exec_all(method, children):
for child in children:
try:
print(method(child, "Hello world"))
except Exception as e:
print("Unable to call method for child '{}': {}".format(child, e.message))
exec_all(ChildA.a, children) # works
exec_all(ChildA.b, children) # works
exec_all(ChildA.a, childrenMixed) # TypeError
exec_all(ChildA.b, childrenMixed) # TypeError
exec_all(Parent.a, childrenMixed) # NotImplementError
exec_all(Parent.b, childrenMixed) # NotImplementError
</code></pre>
<p>前两个<code>exec_all</code>工作正常,但后两个不工作,因为它试图调用<code>ChildA.a</code>,而<code>ChildB</code>中不存在。最后两个提高<code>NotImplementedError</code>。你知道吗</p>
<p>应该是这样的:</p>
<pre><code>A.a: Hello world # 1st exec_all
A.b: Hello world # 2nd exec_all
A.a: Hello world # 3rd exec_all
B.a: Hello world # but TypeError
A.b: Hello world # 4th exec_all
B.b: Hello world # but TypeError
A.a: Hello world # 5th exec_all
B.a: Hello world # but NotImplementError
A.b: Hello world # 6th exec_all
B.b: Hello world # but NotImplementError
</code></pre>
<p>那么如何支持<code>Parent</code>的多个子类呢?你知道吗</p>