Python對象(上)

來源:互聯網
上載者:User

標籤:

Python是一門物件導向的語言,在Python中一切都是對象,函數是對象,類型也是對象。

下面就看看Python中對象相關的內容。

Python對象基本概念

Python對象有三個基本的要素:

  • 身份:對象的唯一性身份標誌,是該對象的記憶體位址(可用內建函數id()獲得)
  • 類型:對象的類型決定了該對象可以儲存什麼類型的值,可進行什麼樣的操作(可用內建函數type()獲得)
  • 值:對象代表的資料

下面看看以下代碼:

num =7print id(num)print type(num)print numprint dir(num)print def isEven(num):    return (num%2 and [False] or [True])[0]    print id(isEven)print type(isEven)print isEvenprint 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為例進行分析:

  1. 首先,list是一種Python內建的容器類型,也就是說list是一個類型對象
  2. 根據"__class__"屬性可以看到,list這個類型對象的類型是<type ‘type‘>
  3. 根據"__bases__"屬性可以看到,list這個類型對象的父類是<type ‘object‘>
  4. 通過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對象有基本的瞭解。當需要進行對象分析的時候,不妨試試文中使用的對象圖,通過這個關係圖,可以更加直觀的看到對象之間的關係。

 

Python對象(上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.