91精产品自偷自偷综合官网版下载-91精产品自偷自偷综合下-91精品-91精品91久久久-91精品成人-91精品成人www

網站建設資訊

NEWS

網站建設資訊

在Python中實現函數重載的方法

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

創新新互聯,憑借10年的成都網站設計、成都做網站經驗,本著真心·誠心服務的企業理念服務于成都中小企業設計網站有上千余家案例。做網站建設,選創新互聯公司

假設你有一個函數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}')

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

以上是在Python中實現函數重載的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!


網站題目:在Python中實現函數重載的方法
文章轉載:http://www.yuzhuanjia.cn/article/gjiojd.html
主站蜘蛛池模板: 91成人午夜性a一级毛 | 一区二区三区欧美日韩精品在线 | 91天堂一区二区三区在线观看 | 99精品国产高清一区 | 果冻传媒天美传媒在 | av天堂电影网在线观看 | 99久re热视频这里只有精品 | 国产av精品一区二区 | 国产av色浴 | 国产av无码日韩av无码网站 | 爆乳一丝丝不挂裸体大胸美女 | 福利视频欧美精品 | 91制片厂果冻传媒大象传媒 | 99久久高清免费看国产一区 | 99热这里只有精品9 99热这里只有精品91 | av在线无修一区 | 97人人添人人爽一 | a级片网站在线观看 | 午夜隔壁老王 | 丰满熟妇人妻中文字幕 | 国产不锈钢 | 97久久无码精品av | 91精品国产免费自 | 91国语对白 | 99久久精品费精品国产一区二 | 国产白浆喷水在线视频免费看 | AV无码偷拍在线观看 | 91视频抖音| 国产成本人在线观看 | 国产av人人夜夜 | 91制片厂果冻传媒公司苏语棠 | 91精品国产福利尤 | 成人色色 | 91亚洲中文天 | 东京热无码中文字幕电影 | 丰满的少妇一 | 99久久国产综合精品五月天喷水 | 97久久精品午夜一区二区 | 91精品无码视频在线视频 | 国产av无码精品麻豆 | 囯产愉拍亚洲精品一区 |