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

笔记更新于2019年11月26日,
摘要:获取对象信息的方法;type( )、isinstance( )、dir( )的使用;getattr( )、setattr( )、hasattr( )的使用


写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ


获取对象信息

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

type( )

type,即类型的意思。在Python中可之间使用 type( ) 来获取对象的类型。

• 获取基本类型

>>> 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.FunctionType
True                                                   #f为函数类型
>>> type(abs)==types.BuiltinFunctionType
True                                                   #abs为内置函数
>>> type(lambda x: x)==types.LambdaType
True                                                   #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或tuple
True
>>> isinstance((1, 2, 3), (list, tuple))               #判断是否为list或tuple
True

• type( )与isinstance( )的区别

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

class A(object):
    pass
class B(A):                                       #B继承A类
    pass
b = 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进行操作即可。


以上就是本节的全部内容,感谢你的阅读。

下一节内容:14.面向对象编程之 访问限制与绑定限制__slots__

有任何问题与想法,欢迎评论与吐槽。

和博主一起学习Python吧( ̄▽ ̄)~*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值