1. 程式人生 > >[python]type和isinstance的比較

[python]type和isinstance的比較

共同點

type和instanceof都可以判斷變數是否屬於某個內建型別

#-*- coding:utf8 -*-
from timeit import timeit
from dis import dis

#用type和isinstance分別判斷{'s'}是否屬於set型別
def a():return type({'s'})is set
def b():return isinstance({'s'},set)
def c():return type({'s'})==set 

time = [timeit(a),timeit(b),timeit(c)]

#列印結果
print
'result:\n%s %s %s\n'%(a(),b(),c()) #列印時間 print 'time:\n%s\n'%( ''.join([str(_)+'\n' for _ in time]) ) #列印指令 print 'orders:\n' dis(a) print '\n' dis(b) print '\n' dis(c)

執行3次 結果:

result:
True True True

time:
0.229784965515
0.217791080475 #最小
0.239007949829

time:
0.232392072678
0.21791100502  #最小
0.229682922363
time: 0.233175992966 0.220207929611 #最小 0.234972953796 orders: 5 0 LOAD_GLOBAL 0 (type) 3 LOAD_CONST 1 ('s') 6 BUILD_SET 1 9 CALL_FUNCTION 1 12 LOAD_GLOBAL 1 (set) 15
COMPARE_OP 8 (is) 18 RETURN_VALUE 6 0 LOAD_GLOBAL 0 (isinstance) 3 LOAD_CONST 1 ('s') 6 BUILD_SET 1 9 LOAD_GLOBAL 1 (set) 12 CALL_FUNCTION 2 15 RETURN_VALUE 7 0 LOAD_GLOBAL 0 (type) 3 LOAD_CONST 1 ('s') 6 BUILD_SET 1 9 CALL_FUNCTION 1 12 LOAD_GLOBAL 1 (set) 15 COMPARE_OP 2 (==)

由此可見,isinstance效率更高一些

不同點

    1.type可以只接收一個引數,列印其未知的所屬的型別;而isinstance只能判斷是否屬於某個已知型別。
print type({'s'})
    2.isinstance可以判斷子類物件是否繼承於父類;而type不可以。
class father(object):
    pass
class son(father):
    pass
if __name__ == '__main__':
    print type(son())==father
    print isinstance(son(),father)
    print type(son())
    print type(son)

結果:

False
True
<class '__main__.son'>
<type 'type'>


由不同點不難發現這倆函式的應用場景是不同的:

    type主要用於獲取未知變數的型別
    isinstance主要用於判斷A類是否繼承於B類