<p>Python在呈现时确实支持“方法重载”。事实上,您刚才所描述的在Python中以许多不同的方式实现是微不足道的,但是我将继续:</p>
<pre><code>class Character(object):
# your character __init__ and other methods go here
def add_bullet(self, sprite=default, start=default,
direction=default, speed=default, accel=default,
curve=default):
# do stuff with your arguments
</code></pre>
<p>在上面的代码中,<code>default</code>是这些参数的一个合理的默认值,或者<code>None</code>。然后,您可以只使用感兴趣的参数调用该方法,Python将使用默认值。</p>
<p>你也可以这样做:</p>
<pre><code>class Character(object):
# your character __init__ and other methods go here
def add_bullet(self, **kwargs):
# here you can unpack kwargs as (key, values) and
# do stuff with them, and use some global dictionary
# to provide default values and ensure that ``key``
# is a valid argument...
# do stuff with your arguments
</code></pre>
<p>另一种选择是直接将所需函数挂接到类或实例:</p>
<pre><code>def some_implementation(self, arg1, arg2, arg3):
# implementation
my_class.add_bullet = some_implementation_of_add_bullet
</code></pre>
<p>另一种方法是使用抽象的工厂模式:</p>
<pre><code>class Character(object):
def __init__(self, bfactory, *args, **kwargs):
self.bfactory = bfactory
def add_bullet(self):
sprite = self.bfactory.sprite()
speed = self.bfactory.speed()
# do stuff with your sprite and speed
class pretty_and_fast_factory(object):
def sprite(self):
return pretty_sprite
def speed(self):
return 10000000000.0
my_character = Character(pretty_and_fast_factory(), a1, a2, kw1=v1, kw2=v2)
my_character.add_bullet() # uses pretty_and_fast_factory
# now, if you have another factory called "ugly_and_slow_factory"
# you can change it at runtime in python by issuing
my_character.bfactory = ugly_and_slow_factory()
# In the last example you can see abstract factory and "method
# overloading" (as you call it) in action
</code></pre>