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))

Python_issubclass&isinstance方法和types&inspect内置模块

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))

Python_issubclass&isinstance方法和types&inspect内置模块

我们还可以使用 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))      # 判断变量是否是布尔类型

Python_issubclass&isinstance方法和types&inspect内置模块

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))

Python_issubclass&isinstance方法和types&inspect内置模块

在用types.ClassType判断变量是否是类,这里有个小坑,当判断一个继承了Object的类时,会返回False。

import types


class A:
    pass

class B(object):
    pass


print(isinstance(A, types.ClassType))
print(isinstance(B, types.ClassType))

Python_issubclass&isinstance方法和types&inspect内置模块

通过type方法查看两个类

class A:
    pass

class B(object):
    pass

print(type(A))
print(type(B))

Python_issubclass&isinstance方法和types&inspect内置模块

可以看到虽然我们都叫类,但是对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))

Python_issubclass&isinstance方法和types&inspect内置模块

综上,如果我们要判断一个类就要考虑两种情况。

import types

class A:
    pass

class B(object):
    pass

print(isinstance(A, (types.ClassType, types.TypeType)))
print(isinstance(B, (types.ClassType, types.TypeType)))

Python_issubclass&isinstance方法和types&inspect内置模块

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))

Python_issubclass&isinstance方法和types&inspect内置模块

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-06
  • 2021-10-16
  • 2022-12-23
  • 2021-08-05
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-16
  • 2021-08-28
  • 2022-01-01
  • 2022-02-16
  • 2022-12-23
  • 2021-08-17
相关资源
相似解决方案