Python3學習筆記12 獲取物件型別

2021-09-12 15:43:18 字數 2285 閱讀 3619

當我們拿到乙個對物件的引用時,如何知道這個物件是什麼型別,有哪些方法呢?

使用type()

首先,我們來判斷物件型別,使用type()函式:

基本型別都可以用type()判斷:

如果乙個變數指向函式或者類,也可以用type()判斷:

但是type()函式返回的是什麼型別呢?它返回對應的class型別。如果我們要在if語句中判斷,就需要比較兩個變數的type型別是否相同:

判斷基本資料型別可以直接寫int,str等,但如果要判斷乙個物件是否是函式怎麼辦?可以使用types模組中定義的常量:

使用isinstance()

對於class的繼承關係來說,使用type()就很不方便。我們要判斷class的型別,可以使用isinstance()函式。

能用type()判斷的基本型別也可以用isinstance()判斷:

並且還可以判斷乙個變數是否是某些型別中的一種,比如下面的**就可以判斷是否是list或者tuple:

使用dir()

如果要獲得乙個物件的所有屬性和方法,可以使用dir()函式,它返回乙個包含字串的list,比如,獲得乙個str物件的所有屬性和方法:

類似__***__的屬性和方法在python中都是有特殊用途的,比如__len__方法返回長度。在python中,如果你呼叫len()函式試圖獲取乙個物件的長度,實際上,在len()函式內部,它自動去呼叫該物件的__len__()方法,所以,以下**是等價的:

我們自己寫的類,如果也享用len(myobj)的話,就自己寫乙個__len__()方法:

剩下的都是普通屬性或方法,比如lower()返回小寫的字串:

僅僅把屬性和方法列出來是不夠的,配合getattr()、setattr()以及hasattr(),我們可以直接操作乙個物件的狀態:

緊接著,可以測試該物件的屬性:

如果試圖獲取不存在的屬性,會丟擲attributeerror的錯誤:

可以傳入乙個default引數,如果屬性不存在,就返回預設值:

也可以獲得物件的方法:

小結通過內建的一系列函式,我們可以對任意的乙個python物件進行剖析,拿到其內部的資料。要注意的是,只有在不知道物件資訊的時候,我們才會去獲取物件資訊。如果可以直接寫:

sum=obj.x+obj.y
就不要寫:

sum=getattr(obj,'x')+getattr(obj,'y')
乙個正確的用法的例子如下:

假設我們希望從檔案流fp中讀取影象,我們首先要判斷該fp物件是否存在read方法,如果存在,則該物件是乙個流,如果不存在,則無法讀取。hasattr()就派上了用場。

請注意,在python這類動態語言中,根據鴨子型別,有read()方法,不代表該fp物件就是乙個檔案流,它也可能是乙個網路流,也可能是記憶體中的乙個位元組流,但只要read()方法返回的是有效的影象資料,就不影響讀取影象的功能。

由於python是動態語言,根據類建立的例項可以任意繫結屬性。

給例項繫結屬性的方法是通過例項變數,或者self變數:

python3學習筆記(12)

import random 關鍵字end可以用於將結果輸出到同一行,或者在輸出的末尾新增不同的字元 list 1,2,3,4,5 for x in list print x,end if條件控制 格式如下 if 表示式 語句塊 語句塊注意前面的空格 else 語句塊多個條件 if condition...

Python3學習筆記

最近在起步學python,聚合一下這個過程中蒐集的資源和對一些基本知識做個小總結,語法基於python3,方便以後查詢。python官方文件 不錯的基礎課程 基本語法 演算法 建模 練習 以下是整理常用可能遺忘的基礎點 python3中的輸入是input 獲得使用者輸入的字串 a input ple...

python3學習筆記

redis訊息佇列的使用 coding utf 8 created on tue mar 26 15 58 34 2019 author admin import redis class redisqueue object def init self,name,namespace queue red...