侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   482

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

运行截图如下:

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

我们可以在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 typesdef fn(): passprint(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))

运行截图如下:

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

也就是说,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)))

运行截图如下:

一般情况下,在判断时,我们优先使用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__())

运行截图如下:

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

如:

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

运行截图如下:

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

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

如:

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

运行截图如下:

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

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

如:

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

运行截图如下:

可以看到调用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批量复制图片到另一个文件夹
    下一条:
    influx+grafana自定义python采集数据和一些坑的总结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客