溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Python中實現(xiàn)函數(shù)重載的方法

發(fā)布時間:2020-08-01 11:49:00 來源:億速云 閱讀:232 作者:清晨 欄目:編程語言

小編給大家分享一下在Python中實現(xiàn)函數(shù)重載的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!

假設(shè)你有一個函數(shù)connect,它有一個參數(shù)address,這個參數(shù)可能是一個字符串,也可能是一個元組。例如

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))

你想在代碼里面兼容這兩種寫法,于是你可能會這樣寫代碼:

def connect(address):
    if isinstance(address, str):
        ip, port = address.split(':')
    elif isinstance(address, tuple):
        ip, port = address
    else:
        print('地址格式不正確')

這種寫法簡單直接,但是如果參數(shù)的類型更多,那么你就需要寫很長的 if-elif-elif-...-else。代碼看起來就非常不美觀。

學習過 Java 的同學,應該對函數(shù)重載比較熟悉,可以定義幾個名字相同的函數(shù),但是他們的參數(shù)類型或者數(shù)量不同,從而實現(xiàn)不同的代碼邏輯。

在 Python 里面,參數(shù)的數(shù)量不同可以使用默認參數(shù)來解決,不需要定義多個函數(shù)。那如果參數(shù)類型不同就實現(xiàn)不同的邏輯,除了上面的 if-else外,我們還可以使用functools模塊里面的singledispatch裝飾器實現(xiàn)函數(shù)重載。

我們來寫一段代碼:

from functools import singledispatch

@singledispatch
def connect(address):
    print(f' 傳輸參數(shù)類型為:{type(address)},不是有效類型')

@connect.register
def _(address: str):
    ip, port = address.split(':')
    print(f'參數(shù)為字符串,IP是:{ip}, 端口是:{port}')

@connect.register
def _(address: tuple):
    ip, port = address
    print(f'參數(shù)為元組,IP是:{ip}, 端口是:{port}')

connect('123.45.32.18:8080')
connect(('123.45.32.18', 8080))
connect(123)

我們運行一下這段代碼,大家看看根據(jù)參數(shù)的不同,有什么樣的不同效果:

在Python中實現(xiàn)函數(shù)重載的方法

可以看到,我們調(diào)用的函數(shù),始終都是connect,但是由于傳入?yún)?shù)的類型不同,它運行的結(jié)果也不一樣。

我們使用singledispatch裝飾一個函數(shù),那么這個函數(shù)就是我們將會調(diào)用的函數(shù)。

這個函數(shù)在傳入?yún)?shù)不同時的具體實現(xiàn),通過下面注冊的函數(shù)來實現(xiàn)。注冊的時候使用@我們定義的函數(shù)名.register來注冊。被注冊的函數(shù)名叫什么無關(guān)緊要,所以這里我都直接使用下劃線代替。

被注冊的函數(shù)的第一個參數(shù),通過類型標注來確定它應該使用什么類型。當我們調(diào)用我們定義的函數(shù)是,如果參數(shù)類型符合某個被注冊的函數(shù),那么就會執(zhí)行這個被注冊的函數(shù)。如果參數(shù)類型不滿足任何一個被注冊的函數(shù),那么就會執(zhí)行我們的原函數(shù)。

使用類型標注來指定參數(shù)類型是從 Python 3.7才引入的新特性。在 Python 3.6或之前的版本,我們需要通過@我們定義的函數(shù)名.register(類型)來指定類型,例如:

from functools import singledispatch

@singledispatch
def connect(address):
    print(f' 傳輸參數(shù)類型為:{type(address)},不是有效類型')

@connect.register(str)
def _(address):
    ip, port = address.split(':')
    print(f'參數(shù)為字符串,IP是:{ip}, 端口是:{port}')

@connect.register(tuple)
def _(address):
    ip, port = address
    print(f'參數(shù)為元組,IP是:{ip}, 端口是:{port}')

同時,還有一個需要注意的點,就是只有第一個參數(shù)的不同類型會被重載。后面的參數(shù)的類型變化會被自動忽略。

以上是在Python中實現(xiàn)函數(shù)重載的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI