当我们拿到一个对象的引用时,如何知道这个对象是什么类型,有哪些方法呢?
使用type():
首先,我们来判断对象类型,使用type()函数:
基本类型都可以用type()判断:
>>>type(223)
>>>type('m')
>>>type(None)
判断基本数据类型可以直接写int,str等,但是如果要判断一个对象是否是函数怎么办?
可以使用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
使用isinstance():
对于class的继承关系来说,使用type()就很不方便,可以使用isinstance()函数。
如果继承关系是:
Object->Animal->Dog->Husky
那么,isinstance()就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象
>>>a = Animal()
>>>d = Dog()
>>>h = Husky()
>>>isinstance(h,Husky)
True
>>>isinstance(h,Dog)
True
>>>isinstance(h,Animal)
True
isinstance()判断的是一个对象是否是该类型的本身,或者位于该类型的父继承链上。
能用type()判断的基本数据类型可以用isinstance()判断:
>>>isinstance('a',str)
True
>>>isinstance(123,int)
True
还可以判断一个变量是否是某种类型的一种
>>>isinstance([1,2,3],(list,tuple))
True
>>>isinstance((1,2,3),(list,tuple))
True
使用dir():
如果想要获得一个对象的所有属性和方法 可以使用dir()函数,它返回一个包含字符串的list
>>>dir('ABC')
['__add__',…………]
仅仅是把属性和方法列出来是不够的,配合getattr(),setattr()及hasattr(),我们可以直接操作一个对象的状态。
>>>class MyObject (object):
…
def __init__(self):
self.x = 9
def power(self):
return self.x*self.x
…
>>>obj = MyObject()
现在,可以测试该对象的属性:
>>>hasattr(obj,'x')
True
>>>hasattr(obj,'y')
False
>>>setattr(obj,'y',20)
>>>hasattr(obj,'y')
True
>>>getattr(obj,'y')
20
如果获取不存在的属性,会抛出AttributeError错误
可以传入一个default参数,如果属性不存在,就返回默认值:
#获取属性'z',如果不存在,就返回默认值404
>>>getattr(obj,'z',404)
也可以获得对象的方法:
>>>hasattr(obj,'power')
True



