为了账号安全,请及时绑定邮箱和手机立即绑定

【Python入门】13.面向对象编程之 获取对象信息type( )、isinstance( )、dir( ) 的用法

标签:
Python

目录

获取对象信息
type( )
• 获取基本类型
• 获取函数或实例的类型
• 判断对象是否为一个函数
isinstance( )
• 判断基本类型
• 判断实例的类型
• 判断变量是否为某一类型中的一种
• type( )与isinstance( )的区别
dir( )
getattr( )、setattr( )以及hasattr( )

获取对象信息

当我们拿到一个对象,想知道它的类型及相关信息时,可以用type( )、或isinstance( )、或dir( )。此外还能使用getattr( )、setattr( )以及hasattr( )对信息进行处理,下面将一一介绍。
type( )
--
type,即类型的意思。在Python中可之间使用type( )来获取对象的类型。

<font size=3>• 获取基本类型</font>

>>> type(111)
<class 'int'>                                           #111是int类型>>> type('aaa')
<class 'str'>                                           #aaa是str类型>>> type(None)
<type(None) 'NoneType'>                                 #None没有类型

注意到,type返回的是对应的class类型。

获取函数或实例的类型
>>> type(abs)
<class 'builtin_function_or_method'>                   #abs是一个内置函数或方法>>>class Animal(object):...    pass>>>a = Animal()>>> type(a)
<__main__.Animal object at 0x0000000000638550>         #a是Animal类型
判断对象是否为一个函数
>>> import types                                       #加入types模块>>> def f():...     pass...>>> type(f)==types.FunctionTypeTrue                                                   #f为函数类型>>> type(abs)==types.BuiltinFunctionTypeTrue                                                   #abs为内置函数>>> type(lambda x: x)==types.LambdaTypeTrue                                                   #lambda x: x是匿名函数>>> type((x for x in range(10)))==types.GeneratorType  #x for x in range(10)) 是生成器类型True

isinstance( )

isinstance( )与type( )类似,是判断对象是否为一个已知的类型,以isinstance(对象,类型)的形式来判断。

• 判断基本类型
>>> isinstance('aaa', str)True>>> isinstance(111, int)True>>> isinstance(b'a', bytes)True
• 判断实例的类型
>>>class Animal(object):...    pass>>>a = Animal()>>>isinstance(a, Animal)
True
• 判断变量是否为某一类型中的一种
>>> isinstance([1, 2, 3], (list, tuple))               #判断是否为list或tupleTrue>>> isinstance((1, 2, 3), (list, tuple))               #判断是否为list或tupleTrue
• type( )与isinstance( )的区别

对于class的继承关系,type() 不会认为子类是一种父类类型,不考虑继承关系。而isinstance() 会认为子类是一种父类类型,考虑继承关系。

class A(object):
    passclass B(A):                                       #B继承A类
    passb = B()                                           #b是B类的实例

type( )的判断:

>>>type(b) == B
True>>>type(b) == A
False

isinstance( )的判断:

>>>isinstance(b, B)
True>>>isinstance(b, A)
True

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

dir( )

dir( )函数可以获取一个对象的所有属性和方法,返回的是一个包含字符串的list。比如我们返回的字符串'11'的信息:

>>>dir('11')
['__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', 'isascii', '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中都是有特殊用途的,比如__len__方法返回长度。实际上,在用len( )函数时,是自动调用该对象内部的方法__len__( )方法,所以下面代码是等价的。

>>> len('11')2>>> '11'.__len__()2

getattr( )、setattr( )以及hasattr( )

能够获取对象信息是不够的,我们还要对对象信息进行相关的操作。

getattr( )函数可以获取对象的一个已知属性或方法;

setattr( )函数可以给对象设置一个属性,并给予相关数据;

hasattr( )函数可以判断对象是否有一个已知属性或方法。

结合着三个函数,我们可以在不知道对象信息的情况下对其信息进行操作。

>>>class A(object):...    pass>>>a = A()>>>hasattr(a, 'name')                             #实例对象a有name属性吗False                                             #没有>>>setattr(a, 'name', 'a')                        #给实例对象a设一个name属性,并赋予值a>>>hasattr(a, 'name')                             #实例对象a有name属性吗True                                              #有>>>getattr(a, 'name')                             #获取实例对象a的name属性a

需要注意的是,这种操作方法只有在不知道对象信息的情况下才会去使用,如果已经知道对象信息,那么直接用a.name进行操作即可。



作者:三贝_
链接:https://www.jianshu.com/p/ff04a70e5b93


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消