常規類型判斷
# 【字符串】類型判斷 isinstance("s", str) # 【浮點數】類型判斷 isinstance(3.14, float) # 【整數型】類型判斷 isinstance(66, int) # 【布爾】類型判斷 isinstance(True, bool) # 【列表】類型判斷 isinstance(["a", 1, True], list) # 【元組】類型判斷 isinstance(("b", 1), tuple) # 【字典】類型判斷 isinstance({"a": 1, "b": 2}, dict) # 【集合】類型判斷 isinstance({"a", "b"}, set)
Function&Method類型判斷
import types def func(): pass class A(object): @classmethod def class_method(cls): pass def method(self): pass print(isinstance(func, types.FunctionType)) # 函數判斷 print(isinstance(A.class_method, types.MethodType)) # 方法判斷 print(isinstance(A().method, types.MethodType)) # 方法判斷 print(isinstance(A.class_method, types.FunctionType)) # 函數的判斷類型不能用於方法的判斷 print(isinstance(A().method, types.FunctionType)) # 函數的判斷類型不能用於方法的判斷

class類型判斷
python3中判斷對象是否是class
class A: pass class B(object): pass print(type(A)) print(type(B)) print(isinstance(A, type)) print(isinstance(B, type))

python2中判斷對象是否是class
在Python2中,如果定義的class未繼承 object (比如A),那么它的類型是classobj

在python2中未繼承object類的class需要使用 types.ClassType 來判定
# coding=utf-8 import types class A: pass class B(object): pass print(type(A)) print(type(B)) print("不繼承object的類A,使用type判斷: %s" % isinstance(A, type)) print("繼承object的類B,使用type判斷:%s"% isinstance(B, type)) print("不繼承object的類A,使用types.ClassType判斷:%s" % isinstance(A, types.ClassType)) print("繼承object的類B,使用types.ClassType判斷:%s" % isinstance(B, types.ClassType))

綜上,python2中,class判斷應包含兩個類型。
# coding=utf-8 import types class A: pass class B(object): pass print("不繼承object的類A,使用types.ClassType判斷:%s" % isinstance(A, (type, types.ClassType))) print("繼承object的類B,使用types.ClassType判斷:%s" % isinstance(B, (type, types.ClassType)))

判斷對象是否是一個已知類或子類的實例化對象。
class A(object): pass class B(A): pass class C(object): pass a = A() b = B() c = C() print(isinstance(a, A)) print(isinstance(b, A)) print(isinstance(C, A))

判斷對象是否是一個已知類或是該已知類的子類
此類判斷需用 issubclass方法。
class A(object): pass class B(A): pass class C(B): pass class D(object): pass print(issubclass(B, A)) print(issubclass(C, A)) print(issubclass(D, A))

module類型判斷
Python的module指的是Python包中以.py結尾的名稱,包含了 Python 對象定義和Python語句。

module類型判斷指的是import 的最后個節點導入的是modulle
import types from settings import base_conf # 導入最后給節點為module ret = isinstance(base_conf, types.ModuleType) print(ret)
擴展:區分module是package還是py文件
注意:如果導入的最后個節點如果是package名稱,但是類型判斷結果仍是module類型。這是因為導入package時,實際實際導入的是該package下的__init__.py
import types from settings import base_conf ret = isinstance(base_conf, types.ModuleType) print("導入py文件名稱的module類型判斷:", ret) print(base_conf.__file__) import settings ret = isinstance(settings, types.ModuleType) print("導入package的module類型判斷:", ret) print(settings.__file__)

通過dir()方法查看兩種對象屬性差異
import settings from settings import base_conf print("settings:", dir(settings)) print("base_conf:", dir(base_conf))

package比py文件module多個__path__屬性,可以使用該區分module的不同類型
import types import settings from settings import base_conf for mod in [settings, base_conf]: if isinstance(mod, types.ModuleType): if hasattr(mod, '__path__'): print("模塊 %s 是package!" % mod.__name__) else: print("模塊 %s 是py文件" % mod.__name__)

