當在子類別需要呼叫父類別的方法時,在python2.2之前,直接用類別名稱呼叫類別的方法,即非綁定的類別方法,並把自身物件self作參數傳進去。
class A(object): def say(self): print 'I am A' class B(A): def say(self): print 'I am B' A.say(self) b = B() b.say()
輸出
I am B I am A
運作好,不過有個問題,當父類別改了名字時,就要把這些明確呼叫父類別的一個個更正,子類別和父類別耦合比較高。
於是python2.2後就推出了super()函數來避免硬編碼,不用關心父類別名叫什麼。
使用super()函數,上面的程式碼可以寫成如下。
class B(A): def say(self): print 'I am B' super(B,self).say()
python3.0後,又做了改良,super()函數不用傳參數,即上面的那行程式碼直接super(). say()就行了。
需要注意的問題:
super只能用在新式類別中。
super在多重繼承有問題,如果子類繼承多個父類,那麼super調用第一個父類的方法。
不要混用這兩種呼叫父類別方法的方案,要麼都用非綁定的類別方法,要麼都用super。不然可能導致沒被呼叫或被呼叫多次。
BUT:
不要一說到 super 就想到父類! super 指的是 MRO 中的下一個類別!
一說到 super 就想到父類這是初學者很容易犯的一個錯誤,也是我當年犯的錯誤。
def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1]
兩個參數cls 和inst 分別做了兩件事:
1. inst 負責產生MRO 的list
2. 透過cls 定位當前MRO 中的index, 並返回mro[index 1]
這兩件事才是super 的實質,一定要記住!
MRO 全名為 Method Resolution Order,它代表了類別繼承的順序。
舉個例子:
class Root(object): def __init__(self): print("this is Root") class B(Root): def __init__(self): print("enter B") # print(self) # this will printsuper(B, self).__init__() print("leave B") class C(Root): def __init__(self): print("enter C") super(C, self).__init__() print("leave C") class D(B, C): pass d = D() print(d.__class__.__mro__)
輸出
enter B enter C this is Root leave C leave B (,,,,)輸出 輸出
super(B, self).__init__()
輸出
知道了super 和父類其實沒有實質關聯之後,我們就不難理解為什麼enter B 下一句是enter C 而不是this is Root(如果認為super 代表“調用父類的方法”,會想當然的認為下一句應該是this is Root)。流程如下,在B 的__init__ 函數中:(
首先,我們取得self.__class__.__mro__,注意這裡的self 是D 的instance而不是B 的
然後,透過B 來定位MRO 中的index,並找到下一個。顯然 B 的下一個是 C。於是,我們呼叫 C 的 __init__,打出 enter C。
順便說一句為什麼B 的__init__ 會被呼叫:因為D 沒有定義__init__,所以會在MRO 中找下一個類,去查看它有沒有定義__init__,也就是去調用B 的__init__。

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版
視覺化網頁開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中