type()
type()函数用于判断对象类型:
>>> type(11) <class 'int'> >>> type('abc') <class 'str'> >>> type(None) <class 'NoneType'> >>> type(abs) <class 'builtin_function_or_method'> >>> type(a) <class 'list'>
type()返回的是对应class类型。下面是判断两个变量的type类型是否相同:
>>> type(11) == type(22) True >>> type('abc') == str True >>> type('abc') == type(33) False
如何判断一个对象是否是函数呢?使用types模块中定义的常量:
>>> import types >>> def f(): ... pass ... >>> type(f) <class 'function'> >>> type(f) == types.FunctionType True >>> type(lambda x:x) == types.LambdaType True >>> type((x for x in range(10))) == types.GeneratorType True
isinstance()
如果存在以下继承关系:object->Animal->Dog->Husty
那么,isinstance()可以告诉我们,一个对象是否是某种类型(续用上篇文章的例子):
>>> class Husty(Dog): ... pass ... >>> a = Animal() >>> b = Dog() >>> c = Husty() >>> isinstance(c,Husty) True >>> isinstance(c,Dog) True >>> isinstance(c,Animal) True >>> isinstance(b,Husty) False
我们可以说Husty是Husty、Dog、Animal类型的对象,却不能说Dog是Husty的对象。应该不难理解吧。
isinstance()同样可以用来判断基本数据类型,甚至可以判断一个变量是否是某些类型中的一种:
>>> isinstance('abc',str) True >>> isinstance(22,int) True >>> isinstance([1,2,3,4],(list,tuple)) True >>> isinstance((1,2,3,4),(list,tuple)) True
dir()
用于获取一个对象的所有方法和属性。返回值是一个包含字符串的list:
>>> dir('abc') ['__add__', '__class__',…… '__hash__', '__init__', '__i ……'isalnum 'isidentifier', 'islower', …… 'translate', 'upper', 'zfill']
其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法,等价于:
>>> len('abc') 3 >>> 'abc'.__len__() 3
据此,我们自己在定义类的时候,自己写一个__len__()方法,就可以使用len(实例变量)功能:
>>> class MyObj(object): ... def __len__(self): ... return 55 ... >>> obj = MyObj() >>> len(obj) 55
往往我们仅仅列出属性和方法还是不够的,配合getattr()、setattr()、hasattr(),我们可以直接操作一个对象的状态:
>>> class MyObj(object): ... def __init__(self): ... self.x = 9 ... def power(self): ... return self.x * self.x ... >>> obj = MyObj() >>> hasattr(obj,'x') True >>> obj.x 9 >>> hasattr(obj,'y') False >>> setattr(obj,'y',22) >>> hasattr(obj,'y') True >>> obj.y 22 >>> getattr(obj,'y') 22
还可以传入一个默认参数,如果属性不存在,返回默认值:
>>> getattr(obj,'h','该页面不存在') '该页面不存在'
再来演示如何获得对象的方法:
>>> hasattr(obj,'power') True >>> f = getattr(obj,'power') >>> f <bound method MyObj.power of <__main__.MyObj object at 0x029FD250>> >>> f() 81
笑声激发自强,发愤、图强、飞身向上