python 重載的實現(single-dispatch generic function)

DAY 11. python 重載

函數重載是指允許定義參數數量或類型不同的同名函數,程序在運行時會根據所傳遞的參數類型選擇應該調用的函數
,但在默認情況下,python是不支持函數重載的,定義同名函數會發生覆蓋

def foo(a:int):print(f'int {a}')def foo(b:list):print(f'list{b}')foo(3)
foo([i for i in range(3)])# list3
# list[0, 1, 2]

至于不支持的原因,我想大概是沒必要,首先,只在兩種情況下可能發生函數重載,一是參數類型不同,二是參數個數不同,對于第一種情況,鴨子類型的存在使得函數不在乎參數類型而只關心參數的行為,所以你可以傳遞任何類型的參數,對于第二種情況,缺省參數的使用使得可以傳遞任意多個參數,因此函數的重載在python中就顯得很雞肋了,但如果非要實現函數重載,可以使用3.4中增加的轉發機制即單分派泛型函數(single-dispatch generic function)來實現重載

11.2 單分派泛型函數

  • 泛型函數 generic function :由多個函數組成的函數,可以根據不同的參數類型決定調用那個函數
  • 單分派,single-dispatch:一種泛型函數分派形式,其中實現是根據單個參數的類型選擇的。

所以,單分派泛型函數就是根據函數的第一個參數類型決定使用哪個函數的泛型函數

將一個函數聲明為泛型函數可以使用修飾器@singledispatch,需要從functools模塊導入,singledispatch有兩個常用方法,register和dispatch

from functools import singledispatch@singledispatch
def Foo(arg,*args):print(arg)

這樣就實現了一個泛型函數,他的分派發生在第一個參數類型上,如果想要基于此實現重載,需要使用他的register方法,

from functools import singledispatch@singledispatch
def Foo(arg,*args):print(arg)# 使用了類型注釋
@Foo.register
def _1(arg:int,*args):print(f'int - {arg}')# 沒有使用類型注釋,顯式傳遞給修飾器
@Foo.register(list)
def _2(arg,*args):print(f'list - {arg}')if __name__ == '__main__':Foo(3)  # int - 3Foo([i for i in range(10)])  # list - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

對于使用了類型注釋的變量,singledispatch會自動推斷第一個參數的類型,如上面int的那個,對于沒有使用類型注釋的變量,可以顯式傳遞類型給singledispatch,如下面list的那個

register屬性還可以以函數的形式調用,這可以用在lambdas表達式上,如

>>> def nothing(arg, verbose=False):
...     print("Nothing.")
...
>>> fun.register(type(None), nothing)

如果沒有實現針對特定類型的注冊,那么就會使用被@singledispatch修飾的函數

Foo("string")  # string

要檢查泛型函數將為給定類型選擇哪個實現,請使用dispatch()屬性

print(Foo.dispatch(int))  # <function _1 at 0x000001D7C2724B70>
print(Foo.dispatch(list))  # <function _2 at 0x000001D7C2792E18>
print(Foo.dispatch(str))  # <function Foo at 0x000001FB456FC268>

要訪問所有已注冊的實現,請使用只讀的registry屬性

11.3 總結

python默認不支持重載,但可以使用單分派泛型函數實現,聲明泛型函數需要使用修飾器@singledispatch,它有三個屬性,register用來注冊針對特定類型的“重載函數”,這里必須指明針對的是哪一個特定的類型,可以給第一個參數類型注釋,也可以給register傳入一個顯式類型,否則會拋出TypeError異常;dispatch屬性用來查看特定的類型將要選擇的函數;registry用來訪問所有已注冊的實現。

參考鏈接:

functools.singledispatch

single dispatch

generic function

python中的重載

為什么 Python 不支持函數重載?其他函數大部分都支持的?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457577.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL中的多表查詢,以及JOIN的順序重要么?

說法是&#xff0c;一般來說&#xff0c;JOIN的順序不重要&#xff0c;除非你要自己定制driving table。 示例&#xff1a; SELECT a.account_id, c.fed_id, e.fname, e.lname-> FROM account AS a INNER JOIN customer AS c-> ON a.cust_id c.cust_id-> INNER JOIN …

python可變對象 不可變對象_【Python】可變對象和不可變對象

在 Python 中一切都可以看作為對象。每個對象都有各自的 id, type 和 value。id: 當一個對象被創建后&#xff0c;它的 id 就不會在改變&#xff0c;這里的 id 其實就是對象在內存中的地址&#xff0c;可以使用 id() 去查看對象在內存中地址。type: 和 id 一樣當對象唄創建之后…

MySQL 調優基礎(三) Linux文件系統

Linux的文件系統有點像MySQL的存儲引擎&#xff0c;它支持各種各樣的文件系統。它最上層是通過 virtual files system虛擬文件系統作為一個抽象接口層來對外提供調用的。然后下層的各種文件系統實現這些調用接口就行了。 1. Linux 中的 日志文件系統和非日志文件系統 文件內容的…

python 經典類和新式類

DAY 12. python新式類和舊式類 繼承自object基類的類叫做新式類&#xff0c;否則叫做舊式類&#xff0c;python3中的類默認是新式類&#xff0c;之前版本默認是舊式類 rootkail:~# python python 2.7.15 (default,Jul 28 2018,11:29:29) [GCC 8.1.0] on linux2 Type "he…

Why does pthread_cond_signal not work?【轉】

轉自&#xff1a;http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote favorite I am currently learing all around POSIX threads (pthread). I now have created a simple program which increased a shared value by 7 until…

Android開發技術周報 Issue#72

新聞 Android N 最初預覽版&#xff1a;開發者 API 和工具教程 Gradle依賴的統一管理 理解Java垃圾回收機制 淺談 Android 編程思想和架構 由Android 65K方法數限制引發的思考 Android音頻開發&#xff08;1&#xff09;&#xff1a;基礎知識 Android音頻開發&#xff08;…

python 單例模式的四種實現方法

DAY 13. 單例設計 13.1 什么是單例設計 一個類每次實例化返回的都是同一個對象&#xff0c;這種設計模式叫做單例設計&#xff0c;這個類叫做單例類 13.2 實現單例設計的方法 13.2.1 重寫__new__() class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次實例化&…

Redis3.2.5部署(單節點)

1.安裝jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字節跳動 設計模式 pdf_憑這份pdf我拿下了美團、字節跳動、阿里、小米等大廠的offer...

關于程序員&#xff0c;除了做項目來提高自身的技術之外&#xff0c;還有一種提升自己的專業技能就是&#xff1a;多&#xff01;看&#xff01;書&#xff01;小編整理出一篇Java進階架構師之路的核心知識&#xff0c;同時也是面試時面試官必問的知識點&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n??m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

這道題要注意的是兩個線程喚醒和等待的順序&#xff0c;應為第一個線程會比第二個線程更早結束&#xff0c;所以如果第一個線程已經結束&#xff0c;而第二個線程還在等待被喚醒&#xff0c;那第二個線程會一直等待下去&#xff0c;因此第一個線程要先等待后喚醒&#xff0c;這…

項目開發容易出錯情況統計

2016年11月17日 11:30:45 星期四 1.適配&#xff1a; a) APP彈窗大屏幕適配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按鈕狀態&#xff1a; a) 按鈕點擊后沒有disable 如果新頁面加載卡頓導致用戶多次點擊&#xff0c;生成多次請求 b) 按鈕disable后什么時候enabl…

python會不會出4_無極4網人生苦短,Python會不會被取代?國外網友

本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載&#xff0c;轉載請聯系出處。人生苦短&#xff0c;我該不該選擇Python&#xff1f;編程語言幾年一變樣&#xff0c;榜單之爭也是愈演愈烈&#xff0c;還架不住時不時殺出個黑馬……而對于Python&#xff0c;自2010年初以來一直蓬…

android 音頻播放總結 soundlPool,MediaPlay

soundlPool 用于小音頻的播放多個同時播放。 使用步驟&#xff1a; 步驟一&#xff1a; 首先下載音頻文件可以將其放入assets文件夾下或者res下的raw文件夾下&#xff0c;區別在于assets下可以再新建文件夾而raw不行&#xff0c;assets內部單個文件超過1m時可能存在bug而raw不會…

文本分析軟件_十大針對機器學習的文本注釋工具與服務,你選哪個?

房地產和鍵【51CTO.com快譯】目前&#xff0c;從搜索引擎與情感分析&#xff0c;到虛擬助手與聊天機器人&#xff0c;機器學習應用場景中的許多研究領域&#xff0c;都需要通過文本注釋工具與服務來提供準確性。在AI研究與開發行業中&#xff0c;發現或創建可注釋的數據對于項目…

sqlite創建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收機制

DAY 18. python垃圾回收機制 python GC主要有三種方式 引用計數標記清除分代回收 其中&#xff0c;以引用計數為主。 18.1 引用計數&#xff08;Reference Counting&#xff09; 《尋夢環游記》中說&#xff0c;人一生會經歷兩次死亡&#xff0c;一次是肉體死的時候&#…

曲線連接線_荷重位移曲線儀操作使用注意事項-荷重位移曲線儀廠家

荷重位移曲線儀廣泛適用于各種按鍵及開關、DOME片、按鍵、微力彈片、硅膠按鍵、汽車開關之荷重-行程測定&#xff1b;Windows中英文雙語軟件&#xff0c;操作簡單方便&#xff0c;軟件流暢穩定&#xff0c;所有測試資料(測試條件&#xff0c;曲線&#xff0c;數據結果&#xff…

進程調度

1、策略 策略決定調度程序在何時讓什么進程運行。調度器的策略往往決定系統的整體印象&#xff0c;并且&#xff0c;還要負責優化使用處理器時間。 1.1 I/o消耗型和處理器消耗型。 進程可以被分為I/O消耗型和處理器消耗型。前者指進程的大部分時間用來提交I/O請求或者等待I/O請…

Django,Ajax,Vue實現文章評論功能

Django評論 評論復雜的地方在于需要實現點擊提交評論后評論內容需要立刻出現在下面&#xff0c;還要保持頁面位置不變&#xff0c;所以提交后不能整體刷新頁面&#xff0c;因為刷新以后頁面肯定在最上面&#xff0c;而評論一般都在最下面&#xff0c;所以要用到Ajax 整個過程用…