深入浅析Python获取对象信息的函数type()、isinstance()、dir()


Posted in Python onSeptember 17, 2018

type()函数:

使用type()函数可以判断对象的类型,如果一个变量指向了函数或类,也可以用type判断。

如:

class Student(object):
 name = 'Student'
a = Student()
print(type(123))
print(type('abc'))
print(type(None))
print(type(abs))
print(type(a))

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

可以看到返回的是对象的类型。

我们可以在if语句中判断比较两个变量的type类型是否相同。

如:

class Student(object):
 name = 'Student'
a = Student()
if type(123) == type(456):
 print("True")

输出结果为True。

如果要判断一个对象是否是函数怎么办?

我们可以使用types模块中定义的常量。types模块中提供了四个常量types.FunctionType、types.BuiltinFunctionType、types.LambdaType、types.GeneratorType,分别代表函数、内建函数、匿名函数、生成器类型。

import types
def fn():
 pass
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x: x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)

isinstance()函数:

对于有继承关系的类,我们要判断该类的类型,可以使用isinstance()函数。

如:

class Animal(object):
 def run(self):
 print("动物在跑")
class Dog(Animal):
 def eat(self):
 print("狗在吃")
class Cat(Animal):
 def run(self):
 print("猫在跑")
dog1 = Dog()
cat1 = Cat()
print(isinstance(dog1, Dog))
print(isinstance(cat1, Cat))
print(isinstance(cat1, Animal))
print(isinstance(dog1, Animal))

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

可以看到子类的实例不仅是子类的类型,也是继承的父类的类型。

也就是说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。

能用type()判断的基本类型也可以用isinstance()判断,并且还可以判断一个变量是否是某些类型中的一种。

如:

print(isinstance('a', str))
print(isinstance(123, int))
print(isinstance(b'a', bytes))
print(isinstance([1, 2, 3], (list, tuple)))
print(isinstance((1, 2, 3), (list, tuple)))

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

一般情况下,在判断时,我们优先使用isinstance()判断类型。

dir()函数:

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。

如,获得一个str对象的所有属性和方法:

print(dir('abc'))

运行结果:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

类似__xxx__的属性和方法在Python中都是有特殊用途的。如在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,因此下面的代码是等价的:

print(len('abc'))
print('abc'.__len__())

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

我们也可以给自己定义的类写一个__len__()方法。

如:

class MyDog(object):
 def __len__(self):
 return 100
dog1 = MyDog()
print(len(dog1))

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

前后没有__的都是普通属性或方法。

我们还可以使用getattr()函数获取属性,setattr()函数设置属性,hasattr()函数查找是否具有某属性。

如:

class MyObject(object):
 def __init__(self):
 self.x = 9
 def power(self):
 return self.x * self.x
obj1 = MyObject()
print(hasattr(obj1, 'x'))
print(hasattr(obj1, 'y'))
setattr(obj1, 'y', 19)
print(hasattr(obj1, 'y'))
print(getattr(obj1, 'y'))

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

如果试图获取不存在的属性,会抛出AttributeError的错误。我们可以传入一个default参数,如果属性不存在,就返回默认值。

getattr()函数、setattr()函数、hasattr()函数也可以用于获得、设置、查找对象的方法。

如:

class MyObject(object):
 def __init__(self):
 self.x = 9

 def power(self):
 return self.x * self.x
obj1 = MyObject()
print(hasattr(obj1, 'power'))
print(getattr(obj1, 'power'))
fn = getattr(obj1, 'power')
print(fn())

运行截图如下:

深入浅析Python获取对象信息的函数type()、isinstance()、dir()

可以看到调用fn()的结果与调用obj1.power()的结果是一样的。

总结:

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。

要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。

如:

def readImage(fp):
 if hasattr(fp, 'read'):
  return readData(fp)
 return None

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。这样hasattr()就派上了用场。

在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

以上所述是小编给大家介绍的Python获取对象信息的函数type()、isinstance()、dir(),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
跟老齐学Python之玩转字符串(3)
Sep 14 Python
python文件操作整理汇总
Oct 21 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
python获取多线程及子线程的返回值
Nov 15 Python
详解python中的 is 操作符
Dec 26 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
python实现定时发送qq消息
Jan 18 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
python写入文件自动换行问题的方法
Jul 05 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 #Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 #Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 #Python
python实现简单http服务器功能
Sep 17 #Python
python实现自动登录
Sep 17 #Python
python发送告警邮件脚本
Sep 17 #Python
python实现zabbix发送短信脚本
Sep 17 #Python
You might like
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
基于jquery的动态创建表格的插件
2011/04/05 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
python是否适合网页编程详解
2019/10/04 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
焊接专业毕业生求职信
2013/10/01 职场文书
我的理想演讲稿
2014/04/30 职场文书
中秋晚会活动方案
2014/08/31 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL