日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 函数重载_在Python中实现函数重载,60%的人都不会

發(fā)布時間:2024/1/23 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 函数重载_在Python中实现函数重载,60%的人都不会 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

connect('123.45.32.18:8080')

connect(('123.45.32.18', 8080))

復(fù)制代碼

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

def connect(address):

if isinstance(address, str):

ip, port = address.split(':')

elif isinstance(address, tuple):

ip, port = address

else:

print('地址格式不正確')

復(fù)制代碼

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

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

在 Python 里面,參數(shù)的數(shù)量不同可以使用默認(rèn)參數(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)

復(fù)制代碼

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

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

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

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

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

使用類型標(biāo)注來指定參數(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}')

復(fù)制代碼

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

最后注意:不管你是為了Python就業(yè)還是興趣愛好,記住:項目開發(fā)經(jīng)驗永遠(yuǎn)是核心,如果你沒有2020最新python入門到高級實戰(zhàn)視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數(shù)字的諧音)轉(zhuǎn)換下可以找到了,里面很多新python教程項目,還可以跟老司機(jī)交流討教!

本文的文字及圖片來源于網(wǎng)絡(luò)加上自己的想法,僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請及時聯(lián)系我們以作處理。

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的python 函数重载_在Python中实现函数重载,60%的人都不会的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。