issubclass&isinstance
issubclass
用于判断一个类是否是一个已知类或是该已知类的子类。注意,该方法只能判断类不能判断实例化对象。
class A: pass class B(A): pass class C: pass D=A print(issubclass(A, A)) print(issubclass(B, A)) print(issubclass(C, A)) print(issubclass(D, A))
isinstance
用于判断一个实例是否是一个已知类或子类的实例。
class A: pass class B(A): pass class C: pass a = A() b = B() c = C() print(isinstance(a, A)) print(isinstance(b, A)) print(isinstance(c, A))
我们还可以使用 isinstance 来判断变量类型,原理是:每次赋值操作其实就是对应类型的一次实例化。
s = "s" i = 1 f = 1.234 l = [1, 2] t = (1, 3) d = {"a": 1} b = True print(isinstance(s, str)) # 判断变量是否是字符串类型 print(isinstance(f, float)) # 判断变量是否是浮点型类型 print(isinstance(i, int)) # 判断变量是否是整数类型 print(isinstance(l, list)) # 判断变量是否是列表类型 print(isinstance(t, tuple)) # 判断变量是否是元组类型 print(isinstance(d, dict)) # 判断变量是否是字段类型 print(isinstance(b, bool)) # 判断变量是否是布尔类型
types&inspect内置模块
types模块
上面介绍了 isinstance 可判断变量类型,那能否判断变量是类、方法或函数呢?答案肯定是能,只是需要用到 types 内置模块
import types class A: def f(self): pass @classmethod def c(cls): pass def B(): pass print(isinstance(A, types.ClassType)) print(isinstance(A.f, types.MethodType)) print(isinstance(A.c, types.MethodType)) print(isinstance(B, types.FunctionType))
在用types.ClassType判断变量是否是类,这里有个小坑,当判断一个继承了Object的类时,会返回False。
import types class A: pass class B(object): pass print(isinstance(A, types.ClassType)) print(isinstance(B, types.ClassType))
通过type方法查看两个类
class A: pass class B(object): pass print(type(A)) print(type(B))
可以看到虽然我们都叫类,但是对python而言却属于不同的类型
所以,继承了object的类再用 types.ClassType就会判断为False,对于这种类我们需要用types.TypeType来判断。
import types class A: pass class B(object): pass print(isinstance(A, types.TypeType)) print(isinstance(B, types.TypeType))
综上,如果我们要判断一个类就要考虑两种情况。
import types class A: pass class B(object): pass print(isinstance(A, (types.ClassType, types.TypeType))) print(isinstance(B, (types.ClassType, types.TypeType)))
inspect模块
对于类、方法或函数的判断,还可以使用 inspect 内置模块
import inspect class A: pass class B(object): def b(self): pass def C(): pass print(inspect.isclass(A)) print(inspect.isclass(B)) print(inspect.ismethod(B.b)) print(inspect.isfunction(C))