isinstance() 与 type() 区别:

type() 不会认为子类是一种父类类型,不考虑继承关系。

isinstance() 会认为子类是一种父类类型,考虑继承关系。

如果要判断两个类型是否相同推荐使用 isinstance()。

使用type()

首先,我们来判断对象类型,使用type()函数:

基本类型都可以用type()判断:

>>> type(123)

>>> type('str')

>>> type(None)

如果一个变量指向函数或者类,也可以用type()判断:

>>> type(abs)

>>> type(a)

但是type()函数返回的是什么类型呢?它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:

>>> type(123)==type(456)

True

>>> type(123)==int

True

>>> type('abc')==type('123')

True

>>> type('abc')==str

True

>>> type('abc')==type(123)

False

判断基本数据类型可以直接写int,str等,但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:

>>> import types

>>> def fn():

... pass

...

>>> type(fn)==types.FunctionType

True

>>> type(abs)==types.BuiltinFunctionType

True

>>> type(lambda x: x)==types.LambdaType

True

>>> type((x for x in range(10)))==types.GeneratorType

True

使用isinstance()

对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。

我们回顾上次的例子,如果继承关系是:

object -> Animal -> Dog -> Husky

那么,isinstance()就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象:

>>> a = Animal()

>>> d = Dog()

>>> h = Husky()

然后,判断:

>>> isinstance(h, Husky)

True

没有问题,因为h变量指向的就是Husky对象。

再判断:

>>> isinstance(h, Dog)

True

h虽然自身是Husky类型,但由于Husky是从Dog继承下来的,所以,h也还是Dog类型。换句话说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。

因此,我们可以确信,h还是Animal类型:

>>> isinstance(h, Animal)

True

同理,实际类型是Dog的d也是Animal类型:

>>> isinstance(d, Dog) and isinstance(d, Animal)

True

但是,d不是Husky类型:

>>> isinstance(d, Husky)

False

能用type()判断的基本类型也可以用isinstance()判断:

>>> isinstance('a', str)

True

>>> isinstance(123, int)

True

>>> isinstance(b'a', bytes)

True

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:

>>> isinstance([1, 2, 3], (list, tuple))

True

>>> isinstance((1, 2, 3), (list, tuple))

True

总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。

使用dir()

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

>>> dir('ABC')

['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

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

>>> len('ABC')

3

>>> 'ABC'.__len__()

3

我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法:

>>> class MyDog(object):

... def __len__(self):

... return 100

...

>>> dog = MyDog()

>>> len(dog)

100

剩下的都是普通属性或方法,比如lower()返回小写的字符串:

>>> 'ABC'.lower()

'abc'

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

>>> class MyObject(object):

... def __init__(self):

... self.x = 9

... def power(self):

... return self.x * self.x

...

>>> obj = MyObject()

紧接着,可以测试该对象的属性:

>>> hasattr(obj, 'x') # 有属性'x'吗?

True

>>> obj.x

9

>>> hasattr(obj, 'y') # 有属性'y'吗?

False

>>> setattr(obj, 'y', 19) # 设置一个属性'y'

>>> hasattr(obj, 'y') # 有属性'y'吗?

True

>>> getattr(obj, 'y') # 获取属性'y'

19

>>> obj.y # 获取属性'y'

19

如果试图获取不存在的属性,会抛出AttributeError的错误:

>>> getattr(obj, 'z') # 获取属性'z'

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'MyObject' object has no attribute 'z'

可以传入一个default参数,如果属性不存在,就返回默认值:

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404

404

也可以获得对象的方法:

>>> hasattr(obj, 'power') # 有属性'power'吗?

True

>>> getattr(obj, 'power') # 获取属性'power'

>

>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn

>>> fn # fn指向obj.power

>

>>> fn() # 调用fn()与调用obj.power()是一样的

81

小结

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写:

sum = obj.x + obj.y

就不要写:

sum = getattr(obj, 'x') + getattr(obj, 'y')

一个正确的用法的例子如下:

def readImage(fp):

if hasattr(fp, 'read'):

return readData(fp)

return None

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

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

python hasattr函数_python学习-type(),isinstance(),dir(),getattr(),setattr(),hasattr()相关推荐

  1. python randrange函数_Python学习-函数补充2-内置函数

    1.abs() 求绝对值 2.all() 参数全部为真,则返回True,否则返回False 3.any() 参数中存在任一个为真,则返回True,全部为假才返回False 4.bin() 将参数转换为 ...

  2. python内置数字类型转换函数_Python学习 Day2-2 Python3的基本数据类型、数据内置类型转换函数...

    Python3的基本数据类型 Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型& ...

  3. python hasattr函数_Python hasattr()函数

    描述: have 有的意思,第三人称单数has.attr是attribute属性的简写.拥有属性的方法,那是什么意思呢.其实它用于判断用于判断对象是否包含对应的属性. 语法: hasattr(obje ...

  4. python eval 入门_Python学习笔记整理3之输入输出、python eval函数

    Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...

  5. python的def函数_Python 学习之 def 函数

    共3118字, 阅读本文需要8分钟 def 函数基础 def 函数的定义 在 python 中,def 函数是用来定义一个 function() 的.基本使用 示例下面我们定义了一个 function ...

  6. python汽车迷_Python学习—函数

    Python基础-函数 认识函数 为什么要使用函数? 1.避免代码重用,在一个完整的项目中,某些功能会反复使用.那么会将功能封装成函数,当我们要使用功能的时候直接调用函数即可. 2.提高代码的可读性 ...

  7. python len函数_Python 初学者必备的常用内置函数

    Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间.目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很常见,这里 ...

  8. python电子版笔记_python学习笔记-电子书

    程序输入和raw_inoput() 内建函数 字符解释 f% :对应小数 >>> print "%s is number %d" % ("python& ...

  9. python iteritems函数_Python six.iteritems方法代码示例

    本文整理汇总了Python中sklearn.externals.six.iteritems方法的典型用法代码示例.如果您正苦于以下问题:Python six.iteritems方法的具体用法?Pyth ...

最新文章

  1. 业界首个实时多目标跟踪系统开源
  2. linux access函数_构建一个即时消息应用(九):Conversation 页面 | Linux 中国
  3. 一个简单的路由映射,让你的树莓派通过SSH外网可访问
  4. python中常见的流程结构-Python学习笔记5程序的控制结构
  5. Apache CXF实战之七 使用Web Service传输文件
  6. django2连接mysql_Django2.2 连接mySQL数据库
  7. 作为大数据开发中最重要技术,spark需要掌握哪些技能呢
  8. 将本地的代码提交到github仓库
  9. wps 项目进度_如何用Excel做项目进度表
  10. cad连筋字体怎么安装_你还在为CAD带“?”号头疼吗?丨CAD2500份字体大全及安装方法丨...
  11. 多目标跟踪入门篇(1):SORT算法详解
  12. Kotlin-Android世界的一股清流-Lambda表达式
  13. leetcode 1859 又是一道字符串分隔的题目
  14. 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了
  15. 手机端有没有好用的图片识别文字工具值得推荐?
  16. 算法和设计模式(面经)
  17. 快乐地谈谈:关于RSA算法中求私钥d的欧几里得方法(辗转相除法)考试向的欸
  18. ppt如何旋转流程图_PPT中smartart图形怎么旋转?PPT中整体旋转或翻转smartart图形的方法介绍...
  19. [OpenGL] 体积光效果实现
  20. 音频格式详解 CD WAV MP3 WMA MIDI RM RA OGG VOF AAC M4A APE FLAC TAK TTA MV RealAudio AIFF AU

热门文章

  1. 1024以内的端口用途
  2. oracle安装图解
  3. 解决android模拟器划动手势时自动输入字母“c” 的问题
  4. java StopWatch计算耗时毫秒数
  5. Android之一分钟完成发表情功能
  6. php删除数组中指定的元素,php如何删除数组中指定的元素?
  7. css3动画属性animation
  8. 吞吐量的概念出自 MBA智库百科
  9. IPv4地址学习总结
  10. appsettings 连接oracle数据库,web.config中配置数据库连接的两种方式(appSettings 与 connectionStrings)...