python支持函数重载吗_Python函数重载

您所要求的是称为多重调度。请参阅演示不同类型分派的Julia语言示例。

然而,在讨论这个问题之前,我们将首先讨论为什么在python中重载并不是您真正想要的。

为什么不超载呢?

首先,需要理解重载的概念以及为什么它不适用于python。When working with languages that can discriminate data types at

compile-time, selecting among the alternatives can occur at

compile-time. The act of creating such alternative functions for

compile-time selection is usually referred to as overloading a

function. (Wikipedia)

Python是一种dynamically类型语言,因此重载的概念并不适用于它。但是,并不是所有的都丢失了,因为我们可以在运行时创建这样的替代函数:In programming languages that defer data type identification until

run-time the selection among alternative

functions must occur at run-time, based on the dynamically determined

types of function arguments. Functions whose alternative

implementations are selected in this manner are referred to most

generally as multimethods. (Wikipedia)

因此,我们应该能够在python中执行多方法,或者,也就是我们所说的:多分派。

多次调度

多方法也称为多分派:Multiple dispatch or multimethods is the feature of some

object-oriented programming languages in which a function or method

can be dynamically dispatched based on the run time (dynamic) type of

more than one of its arguments. (Wikipedia)

Python不支持这种现成的1,但是,碰巧有一个名为multipledispatch的优秀Python包可以做到这一点。

解决方案

下面是我们如何使用multipledispatch2包来实现您的方法:>>> 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

2。注意不要在多线程环境中使用multipledispatch,否则会出现奇怪的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值