Python_issubclass&isinstance方法和types&inspect内置模块
2024-09-08 16:14:50
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监听器
- Javascript中的链表
- Latex感想
- MySQL学习笔记——ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- qml ios长按晃动
- LeetCode Convert Sorted Array to Binary Search Tree(数据结构)
- 【BZOJ】【1008】【HNOI】越狱
- RTMP协议详解(转)
- 通过openssh远程登录时的延迟问题解决
- C# 通过反射初探ORM框架的实现原理
- 使用Boostrap框架写一个登录\注册界面
- Ubuntu 16.04 安装GIMP绘图软件
- Vagrant Box下载缓慢解决方法
- blade 学习
- 网页字体在Frontpage2000制作网页中的讲解
- redis分布式锁的具体应用
- 【Linux】【Jenkins】邮件发送失败的问题javax.mail.MessagingException: Could not connect to SMTP host:
- SpringBoot的spring-boot-starter有哪些(官方)
- cocos2dx 3.x 集成protobuf
- Nginx的Access日志记录的时机
热门文章
- Servlet(2):通过servletContext对象实现数据共享
- logstash 正则表达式
- MicroK8S 安装 修改IP 设置镜像加速 升级 卸载等
- UE4网络模块解析(一)
- [BUUCTF]PWN——[Black Watch 入群题]PWN
- [BUUCTF]REVERSE——reverse2
- 拆分函数Splitter.Split…(Power Query 之 M 语言)
- 🏆【CI/CD技术专题】「Docker实战系列」(1)本地进行生成镜像以及标签Tag推送到DockerHub
- java 数据类型:ArrayList;LinkList性能分析
- git 生成ssh