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


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

  • 相关阅读:
    使用循环计算斐波那契数列
    java 面向过程实现万年历
    学习js回调函数
    序列化和反序列化
    SQL语句增加字段、修改字段、修改类型、修改默认值
    使用SQL语句查询日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期) 日期转字符串
    RGB颜色表
    String 与StringBuilder有什么区别
    C# byte数组与Image的相互转换
    CentOS 7 MySQL、Tomcat、Zookeeper设置开机自启
  • 原文地址:https://www.cnblogs.com/testlearn/p/15711220.html
Copyright © 2020-2023  润新知