0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

了解OOP三大特點中繼承的優(yōu)缺點

馬哥Linux運維 ? 2018-02-06 14:54 ? 次閱讀

Python最簡單的方法是什么?

作為一名程序員或者準程序員,對于面向?qū)ο?a target="_blank">編程簡直熟悉的不能再熟悉。作為當今最流行的編程思想之一(或許可以去掉“之一”),無論是在面試還是工作中,面向?qū)ο蠖际菬o法避開的話題。

對于Python程序員來說,OOP(面向?qū)ο缶幊蹋┑娜筇匦浴獢?shù)據(jù)封裝、繼承和多態(tài)通常是面試中的重點考察問題,因此大部分人對此也相當熟悉。

不過,OOP的優(yōu)缺點你真的了解嗎?今天這篇文章會帶領(lǐng)大家了解一下三大特點中繼承的優(yōu)缺點。

OOP()即所謂面向?qū)ο缶幊?,是一種程序設計思想。OOP把對象作為程序的基本單元,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。面向?qū)ο蟮某绦蛟O計把計算機程序視為一組對象的集合,而每個對象都可以接收其他對象發(fā)過來的消息,并處理這些消息,計算機程序的執(zhí)行就是一系列消息在各個對象之間傳遞。

面向?qū)ο笞钪匾母拍罹褪穷悾–lass)和實例(Instance),必須牢記類是抽象的模板,而實例是根據(jù)類創(chuàng)建出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。

假設我們要創(chuàng)建一個Student類,在Python中,定義類是通過class關(guān)鍵字:

class后面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的,繼承的概念我們后面再講,通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。

定義好了Student類,就可以根據(jù)Student類創(chuàng)建出Student的實例,創(chuàng)建實例是通過類名+()實現(xiàn)的:

可以看到,變量bart指向的就是一個Student的實例,后面的0x10a67a590是內(nèi)存地址,每個object的地址都不一樣,而Student本身則是一個類。

可以自由地給一個實例變量綁定屬性,比如,給實例bart綁定一個name屬性:

由于類可以起到模板的作用,因此,可以在創(chuàng)建實例的時候,把一些我們認為必須綁定的屬性強制填寫進去。通過定義一個特殊的__init__方法,在創(chuàng)建實例的時候,就把name,score等屬性綁上去:

注意:特殊方法“__init__”前后分別有兩個下劃線?。。?/p>

注意到__init__方法的第一個參數(shù)永遠是self,表示創(chuàng)建的實例本身,因此,在__init__方法內(nèi)部,就可以把各種屬性綁定到self,因為self就指向創(chuàng)建的實例本身。

有了__init__方法,在創(chuàng)建實例的時候,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù),但self不需要傳,Python解釋器自己會把實例變量傳進去:

和普通的函數(shù)相比,在類中定義的函數(shù)只有一點不同,就是第一個參數(shù)永遠是實例變量self,并且,調(diào)用時,不用傳遞該參數(shù)。除此之外,類的方法和普通函數(shù)沒有什么區(qū)別,所以,你仍然可以用默認參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)。

繼承

什么是繼承?

繼承是一種創(chuàng)建類的方法,在python中,一個類可以繼承來自一個或多個父類。原始類稱為基類或超類。

了解OOP三大特點中繼承的優(yōu)缺點

查看繼承:

什么時候用繼承?

假如已經(jīng)有幾個類,而類與類之間有共同的變量屬性和函數(shù)屬性,那就可以把這幾個變量屬性和函數(shù)屬性提取出來作為基類的屬性。而特殊的變量屬性和函數(shù)屬性,則在本類中定義,這樣只需要繼承這個基類,就可以訪問基類的變量屬性和函數(shù)屬性??梢蕴岣叽a的可擴展性。

繼承和抽象(先抽象再繼承)

抽象即提取類似的部分。基類就是抽象多個類共同的屬性得到的一個類。

Garen類和Riven類都有nickname、aggressivity、life_value、script四個變量屬性和attack()函數(shù)屬性,這里可以抽象出一個Hero類,里面有里面包含這些屬性。

了解OOP三大特點中繼承的優(yōu)缺點

嚴格來說,上述Hero.init(self,…),不能算作子類調(diào)用父類的方法。因為我們?nèi)绻サ簦℉ero)這個繼承關(guān)系,代碼仍能得到預期的結(jié)果。

總結(jié)python中繼承的特點:

在子類中,并不會自動調(diào)用基類的init(),需要在派生類中手動調(diào)用。

在調(diào)用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數(shù)變量。

先在本類中查找調(diào)用的方法,找不到才去基類中找。

繼承的優(yōu)缺點探討

子類化內(nèi)置類型的缺點

1. 內(nèi)置類型的方法不會調(diào)用子類覆蓋的方法

內(nèi)置類可以子類化,但是內(nèi)置類型的方法不會調(diào)用子類覆蓋的方法。下面以繼承dict的自定義子類重寫__setitem__為例說明:

從輸出可以看到,鍵值對one=1和three=3存入a時均調(diào)用了dict的__setitem__,只有[]運算符會調(diào)用我們預先覆蓋的方法。

問題的解決方式在于不去子類化dict,而是子類化colections.UserDict。

2、子類化collections中的類

用戶自定義的類應該繼承collections模塊,如UserDict,UserList,UserString。這些類做了特殊設計,因此易于拓展。子類化UserDict的代碼如下:

小結(jié):上述問題只發(fā)生在C語言實現(xiàn)的內(nèi)置類型子類化情況中,而且只影響直接繼承內(nèi)置類型的自定義類。相反,子類化使用Python編寫的類,如UserDict或MutableMapping就不會有此問題。

多重繼承

1. 方法解析順序(Method Resolution Order,MRO)

在多重繼承中存在不相關(guān)的祖先類實現(xiàn)同名方法引起的沖突問題,這種問題稱作“菱形問題”。Python依靠特定的順序遍歷繼承圖,這個順序叫做方法解析順序。如圖,左圖是類的UML圖,右圖中的虛線箭頭是方法解析順序:

了解OOP三大特點中繼承的優(yōu)缺點

2、super

提到類的屬性__mro__,就會提到super:

super 是個類,既不是關(guān)鍵字也不是函數(shù)等其他數(shù)據(jù)結(jié)構(gòu)。

作用:super是子類用來調(diào)用父類方法的。

語法:super(a_type, obj);

a_type是obj的__mro__,當然也可以是__mro__的一部分,同時issubclass(obj,a_type)==true

舉個例子, 有個 MRO: [A, B, C, D, E, object]

我們這樣調(diào)用:super(C, A).foo()

super 只會從 C 之后查找,即: 只會在 D 或 E 或 object 中查找 foo 方法。

下面構(gòu)造一個菱形問題的多重繼承來深化理解:

輸出如下:

了解OOP三大特點中繼承的優(yōu)缺點

分析:d.pingpong()執(zhí)行super.ping(),super按照MRO查找父類的ping方法,查詢在類B到ping之后輸出了B.ping()。

3. 處理多重繼承的建議

(1)把接口繼承和實現(xiàn)繼承區(qū)分開;

繼承接口:創(chuàng)建子類型,是框架的支柱;

繼承實現(xiàn):通過重用避免代碼重復,通??梢該Q用組合和委托模式。

(2)使用抽象基類顯式表示接口;

(3)通過混入重用代碼;混入類為多個不相關(guān)的子類提供方法實現(xiàn),便于重用,但不會實例化。并且具體類不能只繼承混入類。

(4)在名稱中明確指明混入;Python中沒有把類聲明為混入的正規(guī)方式,Luciano推薦在名稱中加入Mixin后綴。如Tkinter中的XView應變成XViewMixin。

(5)抽象基類可以作為混入,反過來則不成立;抽象基類與混入的異同:

抽象基類會定義類型,混入做不到;

抽象基類可以作為其他類的唯一基類,混入做不到;

抽象基類實現(xiàn)的具體方法只能與抽象基類及其超類中的方法協(xié)作,混入沒有這個局限。

(6)不要子類化多個具體類;具體類可以沒有,或者至多一個具體超類。例如,Class Dish(China,Japan,Tofu)中,如果Tofu是具體類,那么China和Japan必須是抽象基類或混入。

(7)為用戶提供聚合類;聚合類是指一個類的結(jié)構(gòu)主要繼承自混入,自身沒有添加結(jié)構(gòu)或行為。Tkinter采納了此條建議。

(8)優(yōu)先使用對象組合,而不是類繼承。優(yōu)先使用組合可以令設計更靈活。組合和委托可以代替混入,但不能取代接口繼承去定義類型層次結(jié)構(gòu)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • OOP
    OOP
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    8783

原文標題:Python 繼承概念的這些優(yōu)缺點你知道嗎?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    開關(guān)電源拓撲結(jié)構(gòu)特點優(yōu)缺點對比

    本文主要講述常見的開關(guān)電源拓撲結(jié)構(gòu)特點優(yōu)缺點對比。
    發(fā)表于 07-27 09:19 ?1174次閱讀

    常見開關(guān)電源拓撲結(jié)構(gòu)的特點優(yōu)缺點對比

    常見開關(guān)電源拓撲結(jié)構(gòu),包含特點優(yōu)缺點對比。
    發(fā)表于 10-18 09:38 ?1094次閱讀

    天線各種材質(zhì)的優(yōu)缺點

    目前的工作需要接觸到天線,但是對于天線基本上不了解。這些天從網(wǎng)上了解到天線的材質(zhì)大概分為:彈片、PCB、FPC、陶瓷和LDS這幾類,不知道這幾種材質(zhì)的優(yōu)缺點都有哪些呢?
    發(fā)表于 01-28 16:18

    步進電機拆解/特點/優(yōu)缺點

    步進電機的拆解步進電機的主要特點步進電機驅(qū)動器的特點步進電機的優(yōu)缺點
    發(fā)表于 01-28 06:07

    多核系統(tǒng)的特點優(yōu)缺點是什么

    多核系統(tǒng)的特點優(yōu)缺點是什么多核SoC的嵌入式軟件開發(fā)設計方案
    發(fā)表于 04-27 06:29

    光纖通訊的特點是什么?有哪些優(yōu)缺點?

    光纖通訊的特點是什么?光纖通訊有哪些優(yōu)缺點?
    發(fā)表于 05-25 06:21

    熱電偶測溫原理是什么?有哪些優(yōu)缺點

    熱電偶測溫原理是什么?熱電偶的特點是什么?熱電偶有哪些優(yōu)缺點?
    發(fā)表于 06-08 06:19

    什么是步進電機?步進電機有哪些優(yōu)缺點?

    什么是步進電機?步進電機有哪些特點?步進電機有哪些優(yōu)缺點?步進電機的工作原理是什么?
    發(fā)表于 06-18 09:59

    腳本語言的優(yōu)缺點分別是什么

    什么是腳本語言?腳本語言的特點有哪些?腳本語言的優(yōu)缺點分別是什么?
    發(fā)表于 10-09 09:36

    LwIP的優(yōu)缺點是什么

    (函數(shù)列表)2.4 LwIP 的種編程接口2.4.1 RAW/Callback API2.4.2 NETCONN API2.4.3 SOCKET API2.1 LwIP 的優(yōu)缺點此文以 LwIP 2.
    發(fā)表于 01-20 06:25

    中央空調(diào)與分體空調(diào)的特點優(yōu)缺點

    中央空調(diào)與分體空調(diào)的特點優(yōu)缺點      中央空調(diào)能夠改
    發(fā)表于 01-25 15:58 ?1318次閱讀

    OOP中繼承機制剖析

    繼承是面向?qū)ο蟪绦蛟O計方法學中重要的機制。采用繼承機制來組織和設計類,可以提高程序的抽象程度,使之更接近與人類的自然思維。研究了繼承特點,通過程序?qū)嵗M行對比
    發(fā)表于 05-03 16:57 ?0次下載

    一文了解串行通信的特點優(yōu)缺點

    本文首先介紹了串行通信的分類,其次介紹了串行通信的的特點優(yōu)缺點,最后闡述了串行通信的應用。
    發(fā)表于 04-24 09:32 ?2.3w次閱讀

    一文讀懂can總線的特點優(yōu)缺點

    本文開始介紹了CAN總線的概念和特點,其次介紹了CAN總線的工作原理及優(yōu)缺點,最后介紹了CAN總線的應用。
    發(fā)表于 04-24 16:53 ?9.2w次閱讀
    一文讀懂can總線的<b class='flag-5'>特點</b>和<b class='flag-5'>優(yōu)缺點</b>

    中繼器工作原理 中繼器的種類 中繼器的連接 中繼器的優(yōu)缺點

    中繼器工作原理 中繼器的種類 中繼器的連接 中繼器的優(yōu)缺點 中繼器應用場景
    的頭像 發(fā)表于 02-02 14:11 ?2801次閱讀