笔记更新于2019年11月26日,
摘要:获取对象信息的方法;type( )、isinstance( )、dir( )的使用;getattr( )、setattr( )、hasattr( )的使用
写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ
当我们拿到一个对象,想知道它的类型及相关信息时,可以用type( )、或isinstance( )、或dir( )。此外还能使用getattr( )、setattr( )以及hasattr( )对信息进行处理,下面将一一介绍。
type,即类型的意思。在Python中可之间使用 type( ) 来获取对象的类型。
>>> type(111)
#111是int类型
>>> type('aaa')
#aaa是str类型
>>> type(None)
#None没有类型
注意到,type返回的是对应的class类型。
>>> type(abs)
#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( )与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
对于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( )函数可以获取一个对象的所有属性和方法,返回的是一个包含字符串的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( )函数可以判断对象是否有一个已知属性或方法。
结合着三个函数,我们可以在不知道对象信息的情况下对其信息进行操作。
>>>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吧( ̄▽ ̄)~*