天天看點

python函數重載機制_Python函數重載

您要求的是多次排程。請參閱示範不同類型的排程的Julia語言示例。

但是,在看這個之前,我們首先要解決為什麼在python中你不想要重載的原因。

為什麼不超載?

首先需要了解重載的概念以及為什麼它不适用于python。使用可以在編譯時區分資料類型的語言時,可以在編譯時選擇備選方案。為編譯時選擇建立這樣的替代函數的行為通常被稱為重載函數。(維基百科)

Python是一種動态類型語言,是以重載的概念根本不适用于它。但是,一切都不會丢失,因為我們可以在運作時建立這樣的替代函數:在将資料類型識别推遲到運作時的程式設計語言中,基于動态确定的函數參數類型,在運作時必須在備選函數之間進行選擇。以這種方式選擇其替代實作的函數通常被稱為多方法。(維基百科)

是以我們應該能夠在python中執行多方法,或者,或者稱為多方式排程。

多次派遣

多方法也稱為多次發送:多個排程或多方法是一些面向對象程式設計語言的特征,其中可以基于多個參數的運作時(動态)類型動态地排程函數或方法。(維基百科)

Python不支援開箱即用1。但是,正如它所發生的那樣,有一個很好的python包叫做multipledispatch,就是這樣做的。

以下是我們如何使用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

1. Python 3目前支援單一排程

2.注意不要在多線程環境中使用 multipledispatch,否則會産生奇怪的行為。