深入浅析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中集合类型(set)学习小结
Jan 28 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python字符串拼接六种方法介绍
Dec 18 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
python获取中文字符串长度的方法
Nov 14 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
python可迭代对象去重实例
May 15 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
python如何将mat文件转为png
Jul 15 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读写文件的方法(生成HTML)
2006/11/27 PHP
php 文件缓存函数
2011/10/08 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
Python判断字符串与大小写转换
2015/06/08 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
python -v 报错问题的解决方法
2020/09/15 Python
美国家居装饰店:Pier 1
2019/09/04 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python