Python是一門物件導向的語言,在Python中一切都是物件,函式是物件,型別也是物件。
下面就看看Python中物件相關的內容。
Python物件基本概念
Python物件有三個基本的要素:
- 身份:物件的唯一性身份標誌,是該物件的記憶體地址(可用內建函式id()獲得)
- 型別:物件的型別決定了該物件可以儲存什麼型別的值,可進行什麼樣的操作(可用內建函式type()獲得)
- 值:物件代表的資料
下面看看以下程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
num =7 print id(num) print type(num) print num print dir(num) print def isEven(num): return (num%2 and [False] or [True])[0] print id(isEven) print type(isEven) print isEven print dir(isEven) |
通過程式碼中可以看到,我們定義了一個int型別的數值物件,以及一個函式物件,通過內建的dir()函式,我們可以檢視物件支援的屬性/方法:
Python物件起源
在Python中有兩個最基本的物件,<type ‘object’> 和 <type ‘type’>,這兩個物件是所有物件的起源。
通過下面的程式碼看看<type ‘object’> 和 <type ‘type’>的關係:
程式碼中使用了”__class__”屬性來檢視物件的型別,以及”__bases__”屬性來檢視物件的父類,這兩個屬性很重要,可以檢視本物件跟其他物件的關係。
根據上面程式碼的輸出可以得到下面的物件關係圖:
在Python物件系統中,<type ‘object’>和<type ‘type’>的關係就像雞和蛋的關係,不能說誰先於(建立)誰,兩者是相互依賴的,共同構成了Python物件系統的基礎。
- <type ‘type’>的型別是<type ‘type’>(它本身),<type ‘type’>的父類是<type ‘object’>
- <type ‘object’>的型別是<type ‘type’>,<type ‘object’>沒有父類
介紹到這裡是不是感覺有點繞,沒關係,我們繼續看看下面關於物件的分類。
Python物件的分類
在Python中,所有的物件可以分成兩類:Type Object(型別物件,沒錯,型別也是一個物件)和Non-type Object(非型別物件)。
下面通過一個具體的例子來看看物件的分類:
根據上面例子的輸出可以得到下面的物件關係圖:
這裡我們就以list、mylist為例進行分析:
- 首先,list是一種Python內建的容器型別,也就是說list是一個型別物件
- 根據”__class__”屬性可以看到,list這個型別物件的型別是<type ‘type’>
- 根據”__bases__”屬性可以看到,list這個型別物件的父類是<type ‘object’>
- 通過mylist的”__class__”屬性(<type ‘list’>)可以看到,mylist是list型別物件生成的一個物件(Non-type Object(非型別物件))
通過上面的分析我們可以驗證Python物件分類的原則:
如果一個物件是<type ‘type’>的例項, 那它就是Type Object(型別物件), 否則是Non-type Object(非型別物件)
Type Object和Non-type Object
通過前面的分析可以看到,Type Object(型別物件)包括:
- <type ‘type’>
- <type ‘object’>
- 通過<type ‘type’>生成的物件(型別物件)
Type Object(型別物件)有兩個重要的特性:
- 可以被子類化(subclassed)
- 可以被例項化(instantiated)
回到上面的物件圖,Type Object(型別物件)就是存放在前兩個方格中的物件。
那麼其餘的物件就是Non-type Object(非型別物件),回到物件圖,Non-type Object(非型別物件)就是存放在第三個方格中的物件。實線不能出現在第三個方格中,因為這裡的物件都不能進行子類化(繼承);同樣,虛線箭頭不能出現在第三個方格中,因為這裡的物件都不能進行例項化。
再看<type ‘type’>
<type ‘type’>本身是一個型別物件;同時,<type ‘type’>是所有型別物件(包括<type ‘type’>自身)的型別,也就是說,對所有的型別物件進行type()或者獲取”__class__”屬性都將得到<type ‘type’>。
我們可以匯入types模組,然後通過dir()內建函式來檢視所有的內建型別物件,這些型別物件的型別都是<type ‘type’>:
再看<type ‘object’>
同樣,<type ‘object’>是一個型別物件(因為type(object)是<type ‘type’>);同時,<type ‘object’>是所有型別物件(除去<type ‘object’>本身)的父類。
type()和__class__
這裡需要提一下的是,type()這個內建函式以及”__class__”這個屬性,這兩種方式都可以得到物件的型別,一般來說兩種方式得到的結果是相同的。
但是,對於Python中的經典類(classic class),type()和”__class__”的結果就是不同的了(這裡就不介紹classic class和new-style class了):
對於new-style class,type()和”__class__”的結果就是相同的了。
總結
本文介紹了Python物件中的一些基本點:
- Python物件的三要素
- Python物件中的兩個基本物件<type ‘type’>和<type ‘object’>
- Python物件的分類:Type Object(型別物件)和Non-type Object(非型別物件)
通過這些點,應該可以對Python物件有基本的瞭解。當需要進行物件分析的時候,不妨試試文中使用的物件圖,通過這個關係圖,可以更加直觀的看到物件之間的關係。