天天看點

Python3 面向對象:多态、封裝、繼承

面向對象的程式設計中,對象意味着一系列資料(屬性)以及一套通路和操作這些資料的方法。使用對象而非全局變量和函數的原因有多個,下面列出使用對象的最重要的好處:

  1. 多态:可對不同類型的對象執行相同的操作,操作仍可正常運作;
  2. 封裝:對外部隐藏有關對象工作原理的細節;
  3. 繼承:可基于通用類建立出專用類。

1.多态

多态即多種形态,這意味着即使你不知道變量隻想的是哪種對象,也能對其操作,且操作的行為将随着對象所屬的類型(類)而差異。

多态和方法:

當你收到一個對象,但不知道它是如何實作的——它可能是衆多“形态”中的任何一種。你隻要知道它具有詢問價格這一功能就夠了。

>>>object.get_price()
2.5
           

像這樣與對象屬性相關聯的函數稱為方法。字元串、清單和字典的方法其實也就是一種多态。

>>>'abc'.count('a')
1
>>>[1, 2, 'a'].count('a')
1
           

多态形式多樣:

每當無需知道對象是說明樣的就能對其執行操作時,都是多态在起作用。這不僅僅适用于方法,内置運算符和函數也大量使用了多态。

>>>1 + 2
3
>>>'Fish' + 'license'
'Fishlicense'
           

 很多函數和運算符都是多态的,你編寫的大多數函數也是如此。每當你使用多态的函數和運算符時,多态都将發揮作用。事實上,破壞多要的唯一方法是使用type、issubclass等函數顯式地執行類型檢查,但應盡可能避免以這種方式破壞多态。重要的是,對象按你希望的那樣形事,而非它是否是正确的類型(類)。

2.封裝

封裝指的是向外隐藏不必要的細節。有點像多态(無需知道對象的内部細節就可使用它)。多态和繼承這兩個概念很像,因為他們都是抽象的原則。

但封裝不同于多态,多态讓你無需知道對象所屬的類(對象的類型)就能調用其方法,而封裝讓你無需知道對象的構造就能使用它。

基本上,你希望對象是抽象:當調用方法時無需操心其他的事情,如避免幹擾全局變量。如何将名稱封裝在對象中呢?将其作為一個屬性即可。屬性是歸屬于對象的變量,就像方法一樣。是将上,方法差不多就是與函數相關聯的屬性。對象有自己的狀态。對象的狀态由其屬性(如名稱)描述。對象的方法可能修改這些屬性,是以對象将一系列函數(方法)組合起來,并賦予他們一些變量(屬性)的勸你西安,而屬性可用于在兩次函數調用之間存儲值。

3.繼承

繼承是另一種偷懶的方式。程式員總是想避免多次輸入同樣的代碼(如建立函數達到這個目标)。如果已經有了一個類,并要建立一個與之很像的類(可能隻是新增幾個方法),該如何辦呢?

例如,你可能已經有了一個名為Shape的類,它知道如何将自己繪制到螢幕上。現在你想建立一個名為Rectangle的類,但它不僅知道如何将自己繪制到螢幕上,而且還知道如何計算其面積。你不想重新編寫draw方法,因為Shape已經有一個這樣的方法。那麼如何辦呢?讓Rectangel繼承Shape的方法,使得對Rectangel對象調用方法時,将自動調用Shape類的這個方法。