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

最新文章

  1. Java监听器
  2. Javascript中的链表
  3. Latex感想
  4. MySQL学习笔记——ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  5. qml ios长按晃动
  6. LeetCode Convert Sorted Array to Binary Search Tree(数据结构)
  7. 【BZOJ】【1008】【HNOI】越狱
  8. RTMP协议详解(转)
  9. 通过openssh远程登录时的延迟问题解决
  10. C# 通过反射初探ORM框架的实现原理
  11. 使用Boostrap框架写一个登录\注册界面
  12. Ubuntu 16.04 安装GIMP绘图软件
  13. Vagrant Box下载缓慢解决方法
  14. blade 学习
  15. 网页字体在Frontpage2000制作网页中的讲解
  16. redis分布式锁的具体应用
  17. 【Linux】【Jenkins】邮件发送失败的问题javax.mail.MessagingException: Could not connect to SMTP host:
  18. SpringBoot的spring-boot-starter有哪些(官方)
  19. cocos2dx 3.x 集成protobuf
  20. Nginx的Access日志记录的时机

热门文章

  1. Servlet(2):通过servletContext对象实现数据共享
  2. logstash 正则表达式
  3. MicroK8S 安装 修改IP 设置镜像加速 升级 卸载等
  4. UE4网络模块解析(一)
  5. [BUUCTF]PWN——[Black Watch 入群题]PWN
  6. [BUUCTF]REVERSE——reverse2
  7. 拆分函数Splitter.Split…(Power Query 之 M 语言)
  8. 🏆【CI/CD技术专题】「Docker实战系列」(1)本地进行生成镜像以及标签Tag推送到DockerHub
  9. java 数据类型:ArrayList;LinkList性能分析
  10. git 生成ssh