拿到一个对象的引用时,怎么判断对象的类型,有哪些方法呢
用type()函数
但如何判断一个对象是否是函数怎么办呢 可以使用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
对于class的继承关系来说,使用type()就会很不方便,这时可以使用isinstance()函数
>>> a = Animal()
然后判断
>>> isinstance(a,Animal)
True
isinstance()判断的是一个对象是否是该类型本身或是位于该类型的父继承链上
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如获得一个str对象的所有属性和方法:
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
__xxx__的属性和方法在python中是特殊的,比如__len__方法返回长度,在python中,如果调用len()函数,获取一个对象的长度,实际上它会自动调用对象的__len()__方法,所以下面的代码是等价的:
>>> len('ABC')
3
>>> 'ABC'.__len__()
3
自己的类,如果想用len()函数就可以自己写一个
>>> class MyDog(object):
... def __len__(self):
... return 100
...
>>> dog = MyDog()
>>> len(dog)
100
仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasatt(),我们可以直接操作一个对象的状态
>>> 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
也可以传入一个default参数,如果属性不存在,返回默认值
>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404
也可以获得对象的方法:
>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81
要注意在是,只有在不知道对象信息的时候,我们才会去获取对象信息,如果可以直接写:
sum = obj.x + obj.y
就不要写成
sum = getattr(obj,‘x’)+getattr(obj,‘y’)
一个正确的用法的例子:
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None