亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

在Python中實現函數重載的示例代碼

發布時間:2020-08-21 07:08:21 來源:腳本之家 閱讀:137 作者:青南 欄目:開發技術

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

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('地址格式不正確')

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

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

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

我們來寫一段代碼:

from functools import singledispatch

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

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

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

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

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

在Python中實現函數重載的示例代碼

可以看到,我們調用的函數,始終都是 connect ,但是由于傳入參數的類型不同,它運行的結果也不一樣。

我們使用 singledispatch 裝飾一個函數,那么這個函數就是我們將會調用的函數。

這個函數在傳入參數不同時的具體實現,通過下面注冊的函數來實現。注冊的時候使用 @我們定義的函數名.register 來注冊。被注冊的函數名叫什么無關緊要,所以這里我都直接使用下劃線代替。

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

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

from functools import singledispatch

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

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

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

AI

连平县| 丰台区| 文山县| 江油市| 三明市| 文化| 五莲县| 囊谦县| 于都县| 枣阳市| 金沙县| 抚顺市| 浦江县| 松滋市| 英山县| 南漳县| 会理县| 凭祥市| 同德县| 昔阳县| 怀仁县| 福海县| 平武县| 湖北省| 江源县| 新田县| 克山县| 昆山市| 汉沽区| 凤庆县| 莱州市| 甘肃省| 贵溪市| 丁青县| 奉新县| 海淀区| 蓝田县| 绥宁县| 偏关县| 武义县| 文登市|