type()函數api
type()函數用於判斷基本類型網絡
type(123) #輸出:<class 'int'> type('str') #輸出:<class 'str'> type(None) #輸出:<type(None) 'NoneType'> type(abs) #輸出:<class 'builtin_function_or_method'>,若是一個變量指向函數,也可用type()判斷 type(a) #輸出:<class '__main__.Animal'>,若是一個變量指向類,也可用type()判斷
type()函數返回對應的Class類型ssh
type(123)==type(456) #輸出:True type(123)==int #輸出:True type('abc')==type('123') #輸出:True type('abc')==str #輸出:True
使用types模塊中定義的常量函數
import types type(methodName)==types.FunctionType #輸出:True,使用types模塊中定義的常量,判斷對象是不是函數 type(abs)==types.BuiltinFunctionType #輸出:True type(lambda x: x)==types.LambdaType #輸出:True type((x for x in range(10)))==types.GeneratorType #輸出:True
isinstance()函數ui
isinstance()判斷的是一個對象是不是該類型自己,或者位於該類型的父繼承鏈上spa
要優先使用isinstance()判斷類型,這樣可將指定類型及其子類"一網打盡"code
#繼承關係是:object -> Animal -> Dog -> Husky a = Animal() d = Dog() h = Husky() isinstance(h, Husky) #輸出:True isinstance(h, Dog) #輸出:True isinstance(h, Animal) #輸出:True isinstance(d, Dog) and isinstance(d, Animal) #輸出:True
判斷基本類型,能用type()判斷的基本類型也能夠用isinstance()判斷對象
isinstance('a', str) #輸出:True isinstance(123, int) #輸出:True isinstance(b'a', bytes) #輸出:True
判斷一個變量是不是某些類型中的一種blog
isinstance([1, 2, 3], (list, tuple)) #輸出:True isinstance((1, 2, 3), (list, tuple)) #輸出:True
dir()函數繼承
dir()函數得到一個對象的全部屬性和方法,它返回一個包含字符串的list
得到一個str對象的全部屬性和方法
dir('ABC') #輸出:['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
getattr(),setattr()及hasattr()函數
有時僅僅把屬性和方法列出來是不夠的,需配合使用getattr()、setattr()以及hasattr()
hasattr():判斷對象是否包含某屬性或方法,訪問對象某屬性或方法時,若不肯定對象是否包含,要預先使用該函數進行判斷,不然直接經過"對象.屬性或方法"的方式會報錯
getattr():獲取對象某屬性或方法,可以使用hasattr()預先判斷對象是否包含
也可直接使用該函數獲取,若是沒有,則返回指定默認值,不然直接經過"對象.屬性或方法"的方式會報錯
setattr():給對象設置某屬性或方法,並賦值
只有在不知道對象信息的時候,纔會去獲取對象信息,若是能夠經過"對象.屬性",就不要經過 getattr()方式獲取屬性值
假設但願從文件流fp中讀取圖像,首先要判斷該fp對象是否存在read方法
若是存在,則該對象是一個流,若是不存在,則沒法讀取,可經過hasattr()判斷
請注意,在Python這類動態語言中,根據鴨子類型,有read()方法,不表明該fp對象就是一個文件流
它也多是網絡流,也多是內存中的一個字節流
但只要read()方法返回的是有效的圖像數據,就不影響讀取圖像的功能,如下是正確的方法例子:
def readImage(fp): if hasattr(fp, 'read'): return readData(fp) return None
使用示例
class MyObject(object): def __init__(self): self.x = 9 def power(self): return self.x * self.x obj = MyObject() hasattr(obj, 'x') #輸出:True,判斷對象obj是否有'x'屬性 print(obj.x) #輸出:9 hasattr(obj, 'y') #輸出:False,判斷對象obj是否有'y'屬性 setattr(obj, 'y', 19) #爲對象obj設置一個屬性'y' hasattr(obj, 'y') #輸出:True getattr(obj, 'y') #輸出:19 print(obj.y) #輸出:19 getattr(obj, 'z') #輸出:報錯,若是試圖獲取不存在的屬性,會拋出AttributeError的錯誤,對象obj沒有屬性'z' getattr(obj, 'z', 404) #輸出:404,能夠傳入一個default參數,若是屬性不存在,就返回默認值,獲取屬性'z',若是不存在,返回默認值404 hasattr(obj, 'power') #輸出:True,判斷對象obj是否有'power'方法 getattr(obj, 'power') #輸出:<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>,獲取對象obj的'power'方法 fn = getattr(obj, 'power') #獲取對象obj的'power'方法並賦值到變量fn fn #輸出:<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>,fn指向obj.power fn() #輸出:81