<p>通常在一个具有给定名称的类中只能定义一个方法。在您的示例中,2 argument first()方法覆盖了1 argument first()。如果您想要两个同名的方法,那么在python 3中,您必须使用functools.singledispatch,并将实例方法名称映射到静态方法调度器,哎哟!</p>
<p>也就是说,我真的很喜欢OO编程中的动态调度,我发现它比在某种“master”first()函数中编写手动调度逻辑更干净,这种函数重复性强,扩展性差。</p>
<p>挑战问题:添加另一个方法,如A.first(A arg)。</p>
<p>如果您尝试这样做,您可能会学到很多关于python类型系统的知识!</p>
<pre><code>#!/opt/local/bin/python3.4
from functools import singledispatch;
class A(object):
# default method handles dispatch for undefined types
# note reversed positional args to match single dispatch functools
@singledispatch
def _first(self,arg):
raise TypeError("no match for A._first(%s)" % type(arg));
# adapter maps instance call to (reversed) static method call
def first(self, arg = None): return A._first(arg, self);
# def first()
@_first.register(type(None))
def _(self,none):
print("A.first() called");
# def first(float f)
@_first.register(float)
def _(self,f):
print("A.first(float %s) called" % f);
a = A();
a.first(); # A.first() called
a.first(None); # A.first() called
a.first(3.14); # A.first(float 3.14) called
class B(object): pass;
b = B();
try: a.first(b); # no match for A._first(<class '__main__.B'>)
except TypeError as ex: print(ex);
</code></pre>