常规类型判断
# 【字符串】类型判断 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__)