第八章類與物件

Lianyanfeng.123發表於2021-01-01

1.類的定義
人們在認識客觀世界時經常採用抽象方法來對客觀世界的眾多事物進行歸納、分類。
我們用類來抽象、描述待求解問題所涉及的事物,具體包括兩個方面的抽象:資料抽象和行為抽象。資料抽象描述某類物件共有的屬性或狀態;行為抽象描述某類物件共有的行為或功能特徵。在Python中,使用類來定義同一種型別的物件。類(class)是廣義的資料型別,能夠定義複雜資料的特性,包括靜態特性(即資料抽象)和動態特性(即行為抽象,也就是對資料的操作方法)。一個Python類使用變數儲存資料域,稱為類中的屬性;定義方法來完成動作。物件是類的一個例項,一個類可以建立多個物件。建立類的一個例項的過程被稱為例項化。在術語中,物件和例項經常是可以互換的。物件就是例項,例項就是物件。類和物件的關係相當於普通資料型別和它的變數之間的關係。比如可以定義一個鳥類,那麼你養的一隻寵物鸚鵡就是這個鳥類的一個物件,動物園裡的一隻會表演的八哥也是這個鳥類的一個物件;可以定義一個股票類,那麼某一支具體的股票就是這個股票類的一個物件。
類和物件的關係:
(1)類是物件的抽象,而物件是類的具體例項。
(2)類是抽象的,而物件是具體的。
(3)每一個物件都是某一個類的例項。
(4)每一個類在某一時刻都有零或更多的例項。
(5)類是靜態的,它們的存在、語義和關係在程式執行前就已經定義好了,物件是動態的,它們在程式執行時可以被建立和刪除。
(6)類是生成物件的模板。
2.類的屬性
類的屬性有兩種:類屬性和例項屬性(物件屬性)。類屬性是在類中方法之外定義的,如在例8-1中定義的have_feather、way_of_reproduction、way_of_song均屬於類屬性;例項屬性是在初始化方法_init_()中定義的,定義時以self為字首,只能通過物件名訪問。
3.屬性的訪問許可權
類中的屬性根據外部對其訪問的許可權,分為公有屬性、保護屬性和私有屬性。“單下畫線”開始的屬性叫作保護屬性,只有其本身和子類能訪問到這些屬性。“雙下畫線”開始的是私有屬性,只有該類本身能訪問,即使子類也不能訪問到這個屬性。在Python中,私有屬性也可以通過“物件名.類名私有屬性名”的方式直接訪問私有屬性。沒有以任何下畫線開頭的屬性是公有屬性,在任何地方均可以訪問該屬性。
4.類中的方法
例項的構造與初始化
在8.2節提到過一個類中有一個特殊的方法:init(),這個方法用來初始化一個物件,為屬性設定初值,在建立物件時自動執行。如果一個類中沒有提供_init()方法,Python 將提供一個預設的_init()方法。子類如果想呼叫父類(基類)的_init_()方法,必須顯式呼叫,否則子類的_init__()方法不會自動呼叫父類的_init_()方法。例8-1中的程式就沒有提供_init_()方法,由Python 解析器提供。在例8-3的類中提供了__init_()方法,用來為屬性width 和height設定初值。在例8-4的類中也提供了_init_()方法,用來為屬性name、year、weight和height設定初值。
5.可變變數與不可變產量
Python中所有資料都是物件,物件的變數通常都是指向物件的引用。呼叫函式時,實參的值被傳遞給形參,這個值通常就是物件的引用值。當一個可變物件傳給函式時,函式可能會改變這個物件的內容。當將一個不可變物件傳遞給函式時,物件不會被改變。在Python的內建標準型別中,列表、字典和集合為可變型別,其他均為不可變型別。使用者自定義類的物件是可變物件。

X=10
y=x
type(x),id(x)
(<type 'int>,31162944L)
type(y),id(y)
(<type 'int>,31162944L)

y=20

type(y),id(y)
(<type’int’>,31162704L)

當執行程式的時候,Python會自動為物件的id賦一個表示該物件地址的整數。x為整型變數,10賦值給×,則×指向一個物件(整數10),而後將×賦值給y,這樣,×和y都指向同一個物件(整數10).然後y的賦值發生了變化,20賦值給y,Python會為這個新數字20建立新物件,然後將這個新物件的引用賦值給y,y就指向了一個新物件(整數20)
6.get和set方法
根據前面的介紹,我們已經瞭解到通過給物件的例項屬性賦值可以改變該物件的例項屬性值,如在例8-3中,對於物件tl,可以通過t1.width=8這樣的賦值語句改變例項屬性width的值,但是這樣直接訪問資料域可能會帶來一些問題。例如,可能直接設定成不合法的值,就像上面提到的t1.width=8如果寫成t1.width=-8,那麼這個寬度width就是不合法的,資料不僅直接被篡改,也會導致類難以維護並且易於出錯。為了避免客戶端直接修改屬性的問題,我們提供get方法返回值,set方法設定新值。通常get方法被稱為獲取器或訪問器,set方法被稱為設定器或修改器
7.類的抽象與封裝
類的抽象是指將類的實現和類的使用相分離。類的建立者描述類的功能,建立這個類並告知使用者如何使用這個類。類的使用者並不需要知道類是如何實現的。實現的細節被封裝並對使用者隱藏,這就稱為類的封裝。在例8-3中,類的建立者定義好Rectangle類後,類的使用者就可以建立Rectangle物件,直接呼叫getArea和getPerimeter來計算面積和周長,而並不需要知道面積和周長是如何計算的
8.程式導向程式設計
在軟體開發中有許多不同層次的抽象。在第5章我們已經學習了函式,函式也屬於高階別的抽象,它就像一個提供某種功能的黑箱,使用者只需要瞭解它的功能,並不需要知道函式內部是如何實現的。當設計複雜程式的時候,我們就採用自頂向下逐步求精的方法來實現,即便如此,傳統的程式設計都是程式導向的,按照資料與操作分離的觀點,以過程為中心展開的,在這種程式設計中,強調的是對資料的操作過程。

相關文章