深入浅析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对列表排序的方法实例分析
May 16 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
详解python3百度指数抓取实例
Dec 12 Python
python调用百度REST API实现语音识别
Aug 30 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
django从后台返回html代码的实例
Mar 11 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
JS分页效果示例
2013/10/11 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
Django的信号机制详解
2017/05/05 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
python使用代理ip访问网站的实例
2018/05/07 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
计算机求职信
2014/07/02 职场文书
体育课外活动总结
2014/07/08 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
楚门的世界观后感
2015/06/03 职场文书
千手观音观后感
2015/06/03 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android