当前位置: 首页 > 面试题库 >

Python函数重载

商璞
2023-03-14
问题内容

我知道Python不支持方法重载,但是我遇到了一个似乎无法用一种很好的Pythonic方法解决的问题。

我正在制作一个角色需要射击各种子弹的游戏,但是如何编写用于创建这些子弹的不同功能?例如,假设我有一个函数,该函数创建一个以给定速度从A点移动到B点的子弹。我会写一个像这样的函数:

    def add_bullet(sprite, start, headto, speed):
        ... Code ...

但是我想编写其他创建项目符号的功能,例如:

    def add_bullet(sprite, start, direction, speed):
    def add_bullet(sprite, start, headto, spead, acceleration):
    def add_bullet(sprite, script): # For bullets that are controlled by a script
    def add_bullet(sprite, curve, speed): # for bullets with curved paths
    ... And so on ...

以此类推。有没有一种更好的方法可以在不使用太多关键字参数的情况下实现快速更新呢?重命名各功能是非常糟糕的一点,因为你要么add_bullet1,add_bullet2或add_bullet_with_really_long_name

要解决一些答案:

  1. 不,我无法创建Bullet类层次结构,因为那太慢了。管理项目符号的实际代码在C中,而我的函数是C API的包装器。

  2. 我知道关键字参数,但是检查各种参数组合变得很烦人,但是默认参数可以像 acceleration=0


问题答案:

首先,需要了解重载的概念以及为什么它不适用于python。

当使用在编译时可以区分数据类型的语言时,可以在编译时进行选择。创建用于编译时选择的此类替代函数的操作通常称为重载函数。(维基百科)

Python是一种动态类型的语言,因此重载的概念根本不适用于它。但是,所有这些都不会丢失,因为我们可以在运行时创建此类替代函数:

在将数据类型标识推迟到运行时的编程语言中,必须根据功能参数的动态确定类型,在运行时进行其他功能的选择。以这种方式选择其替代实现的功能通常被称为多方法。(维基百科)

因此,我们应该能够做到多方法在python-或者,它也可称为:多分派。

多次调度

多重方法也称为多重调度:

多种调度或多种方法是某些面向对象的编程语言的功能,其中可以基于多个参数的运行时(动态)类型来动态调度函数或方法。(维基百科)

Python不支持这个开箱1,但是,因为它发生,有一个优秀的Python包称为multipledispatch这正是这么做的。

解决方案

这是我们可能如何使用multidispatch 2包来实现你的方法的方法:

>>> from multipledispatch import dispatch
>>> from collections import namedtuple  
>>> from types import *  # we can test for lambda type, e.g.:
>>> type(lambda a: 1) == LambdaType
True

>>> Sprite = namedtuple('Sprite', ['name'])
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Curve = namedtuple('Curve', ['x', 'y', 'z'])
>>> Vector = namedtuple('Vector', ['x','y','z'])

>>> @dispatch(Sprite, Point, Vector, int)
... def add_bullet(sprite, start, direction, speed):
...     print("Called Version 1")
...
>>> @dispatch(Sprite, Point, Point, int, float)
... def add_bullet(sprite, start, headto, speed, acceleration):
...     print("Called version 2")
...
>>> @dispatch(Sprite, LambdaType)
... def add_bullet(sprite, script):
...     print("Called version 3")
...
>>> @dispatch(Sprite, Curve, int)
... def add_bullet(sprite, curve, speed):
...     print("Called version 4")
...

>>> sprite = Sprite('Turtle')
>>> start = Point(1,2)
>>> direction = Vector(1,1,1)
>>> speed = 100 #km/h
>>> acceleration = 5.0 #m/s
>>> script = lambda sprite: sprite.x * 2
>>> curve = Curve(3, 1, 4)
>>> headto = Point(100, 100) # somewhere far away

>>> add_bullet(sprite, start, direction, speed)
Called Version 1

>>> add_bullet(sprite, start, headto, speed, acceleration)
Called version 2

>>> add_bullet(sprite, script)
Called version 3

>>> add_bullet(sprite, curve, speed)
Called version 4


 类似资料:
  • 我只是想知道是否有人能帮我解决这个问题。作为我学校项目的一部分,我目前正在为大学锦标赛设计一个计分程序。 现在,我有一个单间的主菜单。py文件,但我有一个不同的注册学生函数。py文件。到目前为止,我已经成功地将该函数调用到主菜单程序中 因此,我调用了register student函数末尾的主菜单函数。这可以让你注册一个学生(他的名字会被添加到一个文本文件中),然后把你送回主菜单,让用户选择另一个

  • 问题内容: 就像这样说: http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python- list/2003-May/206149.html Python中不存在函数重载。 就我而言,这也是一种面向对象的语言,因此对我来说是一个很大的障碍。最初,我发现无法区分参数类型很困难,但是Python的动态

  • 当我说时,我可以从np访问numpy中的所有模块和子模块。我不必说。这个功能叫什么?我如何在我的包中实现它。

  • 我是Python新手,和许多人一样来自Matlab。我习惯于将我的函数定义为独立函数。只要函数保存在定义的Matlab路径中的某个位置,就可以从第二个脚本轻松调用它们。 我已经学会了如何在Python中定义(用户定义的)函数(def my_function()等),但我在Google搜索中发现了一种在单独的应用程序中定义函数的方法。py文件A,以及如何在另一个脚本B中调用它。我能找到的所有帮助文件

  • 主要内容:Python函数的定义,Python函数的调用,为函数提供说明文档Python 中函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。 除了可以直接使用的内置函数外,Python 还支持自定义函数,即将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的。 举个例子,前面学习了 len() 函数,通过它我们可以直

  • 本文向大家介绍跟老齐学Python之重回函数,包括了跟老齐学Python之重回函数的使用技巧和注意事项,需要的朋友参考一下 函数的基本结构 Python中的函数基本结构:     语句  几点说明:  •函数名的命名规则要符合python中的命名要求。一般用小写字母和单下划线、数字等组合  •def是函数的开始,这个简写来自英文单词define,显然,就是要定义一个什么东西  •函数名后面是圆括号