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

Python_issubclass&isinstance方法和types&inspect内置模块的更多相关文章
- $.on()方法和addEventListener改变this指向
jQuery $.on()方法和addEventListener改变this指向 标签(空格分隔): jQuery JavaScript jQuery $.on() jq的绑定事件使用$([selec ...
- ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...
- Spark Rdd coalesce()方法和repartition()方法
在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...
- ThinkPHP的D方法和M方法的区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- 精益化设计:把敏捷方法和Lean UX相结合
敏捷方法已经成为了主流.同时,Kindle和iPhone等设备取得的巨大成功也推动了体验设计的飞速发展.不过,如何把敏捷方法和UX设计结合起来,一直以来都是一个难题.文章将探讨如何把UX融入到最流行的 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- Java提高篇——equals()方法和“==”运算符
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
随机推荐
- 加密时java.security.InvalidKeyException: Illegal key size or default parameters解决办法
需 Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_policy.jar.US_export_policy.jar)做了相应限制.因此存在一些问题: ...
- js实现点击不同按钮切换内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#.NET编程小考30题错题纠错
1)以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和Deserialize()方法可以分别用来实现 ...
- redis实例cpu占用率过高问题优化
目录 一.简介 一.简介 前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然 ...
- STL模板前言(1)
STL提供以下数据结构方便使用: 顺序容器: vector(动态数组):从后面直接插入删除元素,直接访问任何元素. deque(双端队列):从前面和后面快速插入删除,直接访问任何元素. list(双链 ...
- 文件系统系列学习笔记 - inode/dentry/file/super(2)
此篇文章主要介绍下linux 文件系统下的主要对象及他们之间的关系. 1 inode inode结构中主要包含对文件或者目录原信息的描述,原信息包括但不限于文件大小.文件在磁盘块中的位置信息.权限位. ...
- CF125A Measuring Lengths in Baden 题解
Content 在 Baden,一英寸等于 \(3\) 厘米,一英尺等于 \(12\) 英寸. 现在有一个 \(n\) 厘米的物体,求在 Baden,它是几英尺又几英寸. 数据范围:\(1\leqsl ...
- AcWing 1204. 错误票据
题目: 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号. 全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成 ...
- 【LeetCode】975. Odd Even Jump 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- 【LeetCode】51. N-Queens 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...