高樓萬丈平地起,基礎要打牢!Python獲取類的層次結構和繼承順序

2020-12-13 python高手養成

上一篇內容我們詳細了解了Python使用inspect模塊獲取一個模塊、類、實例、函數的信息及幫助文檔的方法(參見新手入門到進階,你不可不知的模塊,用Python獲取對象的詳細信息)。

前情提要

今天,我們繼續領略inspect模塊的一些高級用法——使用inspect模塊獲取一個類的層次結構和類的繼承順序。

準備好了嗎?馬上開始

無聊的文檔

以下是文檔官方描述,文檔恐懼的小夥伴慎入,不喜歡讀文檔的小夥伴可跳過直接看例子學習

inspect.getclasstree(classes, unique=False)

該函數文檔中的解釋是:Arrange the given list of classes into a hierarchy of nested lists,翻譯過來就是將給定的類列表排列成嵌套列表的層次結構。

在出現嵌套列表的地方,它包含從緊靠列表前面的類派生的類,返回的每個條目都是一個2元組,包含一個類及其基類的元組。這是講了返回值

參數「unique」默認為False,如果為True,則給定列表中每個類的返回結構中只會出現一個條目。否則,使用多重繼承的類及其子代將多次出現。這裡講參數

怎麼樣?是不是很複雜,其實它就是根據一個給定的類或者基類,創建一個類似樹的數據結構,返回列表中,各個元素可能是一個包含類及其基類的元組,也可能是另一個包含子類元組的列表。

好乏味

上面講了一串東西,很無聊,不是嗎?

再簡單點理解,就是用它可以知道類的層次結構和繼承順序。

對著一個簡單的例子來理解下,千萬別走開哦……

定義示例類

舉個例子

首先定義四個相互繼承的類A、B、C、D

class A(object):

pass

class B(A):

pass

class C(B):

pass

class D(C, A):

pass

獲取類的層次結構

例子中繼承順序是這樣的:B繼承自A,C又繼承自B,D有兩個父類C、A

我們使用上面的方法看下類A、B、C、D的層次結構。

怎樣的層次結構?

import inspect

from pprint import pprint

pprint(inspect.getclasstree([A,B,C,D]))

>>>

[(<class 'object'>, ()),

[(<class '__main__.A'>, (<class 'object'>,)),

[(<class '__main__.B'>, (<class '__main__.A'>,)),

[(<class '__main__.C'>, (<class '__main__.B'>,)),

[(<class '__main__.D'>, (<class '__main__.C'>, <class '__main__.A'>))]],

(<class '__main__.D'>, (<class '__main__.C'>, <class '__main__.A'>))]]]

好吧,貌似把本來不算複雜的問題被我們搞複雜了

但它確實列印出來了類的層次結構。我們定義一個函數,將上面的結果處理下

把上面的內容整理一下

def print_class_tree(tree, indent=-1):

if isinstance(tree, list):

for node in tree:

print(print_class_tree(node, indent + 1))

else:

print("\t" * indent + tree[0].__name__)

return ""

然後來看下編譯器中返回的結果

PyCharm中運行結果

成功獲取類的層次結構。然後我們使用參數unique=True看下結果。

設置unique為True時運行結果

可以看出,子類D對於A的繼承沒有顯示出來,但這樣貌似更加直觀。但它的代價是減少了部分繼承內容。

多重繼承的順序

我們知道,對於一個多重繼承的類(有多個父類),如果其父類中都定義了一個重名方法,那麼,子類使用哪個父類的同名方法呢?這就牽扯到繼承順序的問題?

有兩種方法

方法一:使用類名.__mro__或者直接使用類名.mro()方法獲取

print(D.mro()) 或者print(D.__mro__)

>>>(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

其實,細心的小夥伴肯定能發現,D.mro()返回的是個列表list類型,而D.__mro__返回的則是個元組tuple類型。

方法二:使用inspect.getmro()方法獲取,示例如下:

print(inspect.getmro(D))

>>>(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

結果完全相同,使用inspect.getmro(D)方法等同於D.__mro__。

獲得清晰的繼承關係

為什麼不讓它更直觀一點呢?

對於這個問題,直接遍曆元組,獲取逐個獲取類名即可解決

for item in inspect.getmro(D):

print("{}".format(item.__name__))

輸出結果如下

>>>

D

C

B

A

object

清晰反映了類的繼承順序。

好了,今天的內容就到這裡了,喜歡的小夥伴們點個讚唄!

對於Python類的繼承順序,到底是「深度優先」還是「廣度優先」,歡迎大家留言討論。

轉載請註明出處,百家號:Python高手養成

相關焦點

  • 《高樓萬丈平地起》在央視首播
    10月26日,由省委宣傳部、省電影局、西北大學、陝西師範大學指導,延安市委宣傳部、省電影家協會承辦的音樂故事片《高樓萬丈平地起》全國首映禮在西安舉行,該片當晚在央視電影頻道黃金檔首播。《高樓萬丈平地起》講述了在一個陝北村莊,鄉紳之女白靜愛上了長工郝石娃,其父白振東不同意。
  • 《高樓萬丈平地起》:一部關於愛與奮鬥的紅色傳奇
    不久前,由陝西省委宣傳部、省電影局、西北大學指導,延安市委宣傳部、省電影家協會承辦的音樂故事片——《高樓萬丈平地起》的全國首映禮在西安舉行,並同步在央視電影頻道黃金檔首播。
  • 萬丈高樓平地起——九星飛伏
    歡迎來的百家號(自我維護),我們今天講述:《九星飛伏》萬丈高樓平地起,為什麼要學習九星飛伏呢?因為當你了解了大自然宇宙的規律的時候,你才能夠更加的順勢而為,輕車熟路。右手掐指越掐越窮,我們最終的目的是會吧,技能,用到手上和我們的工具上,所以說必須要懂得必須用左手,如果你不用,不能夠,這個規律,我都看到有,手指除開拇指和尾指,一共有三根手指。上邊為南,下邊為北,我們在學九宮八卦的時候,已經學習過,就不再重複,那東和東南之間為,東,和南之間為東南來的核心是堅為西南,西和北之間為西北,東和北之間呢為東北,那有了這個基礎之後呢,這是永久不變的。
  • 《高樓萬丈平地起》確實震撼!
    第三屆陝西省十大陝北民歌手和獲獎歌手在西安市索菲特人民大廈大劇院舉行頒獎晚會,所有獲獎歌手齊唱《高樓萬丈平地起》,震撼全場觀眾。
  • Python打牢基礎,從22個語法開始!
    萬丈高樓平地起,咱們先從Python中最最基礎的開始。為了說明它們的主要區別,筆者引用Python實戰圈圈友勞元輝的一段話:「我三劍客在手,感覺可以屠進天下報表和模型。Anaconda,最主要是整體開發環境和第三方庫的安裝方便;Pycharm,最主要執行整個報表腳本和各種數據源的獲取還有定時腳本執行;Jupyter notebook,最主要是模型訓練,每步即時執行,可以可視化看到結果。」。這段話精確總結了三者的區別。
  • 平地起高樓,困境造英雄
    平地起高樓,是一塊磚一塊磚的累積,才有高度的不斷拔高,最終屹立於世人面前,杜拜的哈利法塔,王國大廈,一帶一路大廈,無一不是歷盡艱難,耗費巨力才凝練而成,是藝術品,也是時光歲月的見證。正是經歷了無數的艱難困苦,克服重重阻礙,才成就了平地高樓。
  • 吉林舒蘭,高樓萬丈平地起,玉米也有這樣的功能?
    「高樓萬丈呀,平地起。盤龍臥虎呀,高山頂。邊區的太陽,紅又紅,邊區的太陽紅又紅……「網傳12月6日,吉林省舒蘭市二合村在村口用玉米建成了一座三層樓高的景觀。據說,玉米工程高11.8米,底座直徑4米,用了10000個左右玉米棒。
  • 《哇,高樓》:萬丈高樓平地起
    偶然看到浪花朵朵的新書《哇,高樓》,被封面上幹活的小熊,小貓所吸引。我家孩子這個年紀正是對小動物敏感和喜愛的時期,又出於對浪花朵朵高品質圖書的信賴。我也沒多想,閉著眼睛下了單。每層樓裡充滿了故事和細節。把12張卡片全部拼接在一起,鋪展開來,一副生動的高樓景象躍然眼前。
  • 萬丈高樓平地起——《維多利亞一號》!
    萬丈高樓平地起——《維多利亞一號》!紅顏秀影,今天就為大家短評一下這部重口的香港電影。在國內導演中,彭浩翔從來都是特別的存在,沒有濃墨重彩的大場面,沒有時代變遷下的人物命運,他像是都市人的斯斯耳語。一個想買房的單身女性,在銀行做一份電話營銷的工作,三份工連軸轉,好不容易存了首付要買樓:維多利亞一號——那裡能看到海,是自己初戀曾經住的地方。
  • 萬丈高樓平地起,千裡之行始於足下 | 毛筆英文書法宣紙扇
    Great oaks from little acorns grow是句英語諺語,字面翻譯是參天橡樹長自小橡樹種子,意譯為「萬丈高樓平地起,千裡之行始於足下」。荀子曾經說過:「不積跬步,無以至千裡;不積小流,無以成江海。」
  • Python新式類的方法解析順序MRO與Super
    python3以前新式類:廣度優先 python2.2新式類:廣度優先的C3算法實現(拓撲排序) BFS python2.3及以後python 用MRO的目的是什麼解決多重繼承的二義性的問題(二義性:父類存在同名函數的時候會產生二義性)為python調用一個類或者實例方法的時候提供查找順序
  • 華潤總部大廈,萬丈高樓平地起,其高度為392.5米
    選址方略讓這座巨型樓盤「天生」就擁有非常好的自然條件和地理環境。這幢巨大的高樓,佔地面積大概在1.57萬平方米!是個十足的小胖子。其建築面積也不容小覷,也在26.7萬平方米上下,設計高度在392.5米,設計師在地面以上共建66層。大廈於6年前的10月份開始奠基儀式,正式開始動工,如今萬丈高樓平地起,今年2018即將全面的投入使用!
  • 菜鳥學Python雜談1: 3分鐘學Python變量和數據類型
    大體就這幾個方面,萬丈高樓平地起,我們先從最簡單的變量和數據入手.一:Python的變量類型非常簡單:主要分下面幾類:1.numbers:分整數int和浮點數float整數:比如1,200,-1000,0,也有用十六進位表示的比如0xff00等浮點數:比如1.11,12,13,-10.02,也有比較大的浮點數比如2.12x10^92.String :單引號,雙引號和三引號python
  • 《麥肯錫教我的寫作武器》:萬丈高樓平地起 500強比你出色的原因
    寫文章「萬丈高樓平地起」,首先就得收集有效的建築材料。在書中,作者高杉尚孝把信息分為三種,記述類、評價類和規範類。讓我們結合本書來舉例說明。(1)記述類信息:記述類信息描述了的情況和現象本身,無論表述得對還是錯,只要客觀描述,都是記述性表達。
  • 使用Python Super()為類提供繼承支持
    單繼承中的super()如果您不熟悉面向對象的編程概念,繼承可能是一個不熟悉的術語。 繼承是面向對象編程中的一個概念,其中類從另一個類派生(或繼承)屬性和行為,而無需再次實現它們。至少對我來說,在查看代碼時更容易理解這些概念,所以讓我們編寫描述繼承結構的類:
  • 明天開始,運勢驟生,連發大財,家業萬丈高樓平地起的4生肖
    生肖狗屬狗的人明天開始,財運走上坡,貴人如雲前來相助,生肖狗的事業更能順利的進步,家業萬丈高樓平地起,一躍而起在家業之上,他們還會堅持好好努力,所以賺錢還將更多,連家人都富貴有餘,明天開始就是富貴的第一天!生肖鼠 屬鼠之人,做事情也非常有主見,在愛情裡面的他們是很專一的。
  • 「字母」高樓平地起(圖)
    在朝陽區西壩河附近,「UHN國際村」小區新蓋的十幾棟高樓以其奇特的外形結構吸引了許多人的目光。  記者在該小區內看到,小區的幾棟高樓都是以英文字母「U」、「H」和「N」為造型,字母有大寫有小寫,有的平地相連,有的凌空飛架,遠遠看上去有些像幾個巨大的英文字母,非常具有立體感。
  • ...英語咋備考 名校英語教師支招:打牢基礎、擴充課外閱讀、練習寫作
    楊瑞娟老師建議:第一,增加對英語的學科興趣和深度熱愛。第二,打牢基礎。基礎不牢,地動山搖。第三,擴充課外閱讀,增強語篇理解能力。第四,要在老師的指導下有步驟地練習寫作。由於單項選擇題只是單個句子中看詞語的運用,很多情況下無法完全通過語境來考查,所以,有學生是靠『蒙』和『猜』來應付中考單選題的專項訓練,但以後,這種方法行不通了。」她說,這種試卷結構的改變進一步降低了客觀選擇題的比例,加大了主觀題的考查力度,順應了時代對英語語言綜合運用能力考查的要求。
  • 黑客入門必學——數據結構基礎知識(乾貨)
    萬丈高樓平地起,一口吃不成個胖子。只有打好地基,才能獲得更高更好的發展。想成為一名黑客,就肯定與計算機脫不掉關係。想要寫好代碼,卻不懂數據結構,那是萬分的不妥。所以,還是乖乖來惡補數據結構的基礎知識吧。