商丘网站,网站建设公司代理,微信小程序游戏修改器,做网站外包价格isinstance() 与 type() 区别#xff1a;type() 不会认为子类是一种父类类型#xff0c;不考虑继承关系。isinstance() 会认为子类是一种父类类型#xff0c;考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。使用type()首先#xff0c;我们来判断对象类型…isinstance() 与 type() 区别type() 不会认为子类是一种父类类型不考虑继承关系。isinstance() 会认为子类是一种父类类型考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。使用type()首先我们来判断对象类型使用type()函数基本类型都可以用type()判断 type(123) type(str) type(None)如果一个变量指向函数或者类也可以用type()判断 type(abs) type(a)但是type()函数返回的是什么类型呢它返回对应的Class类型。如果我们要在if语句中判断就需要比较两个变量的type类型是否相同 type(123)type(456)True type(123)intTrue type(abc)type(123)True type(abc)strTrue type(abc)type(123)False判断基本数据类型可以直接写intstr等但如果要判断一个对象是否是函数怎么办可以使用types模块中定义的常量 import types def fn():... pass... type(fn)types.FunctionTypeTrue type(abs)types.BuiltinFunctionTypeTrue type(lambda x: x)types.LambdaTypeTrue type((x for x in range(10)))types.GeneratorTypeTrue使用isinstance()对于class的继承关系来说使用type()就很不方便。我们要判断class的类型可以使用isinstance()函数。我们回顾上次的例子如果继承关系是object - Animal - Dog - Husky那么isinstance()就可以告诉我们一个对象是否是某种类型。先创建3种类型的对象 a Animal() d Dog() h Husky()然后判断 isinstance(h, Husky)True没有问题因为h变量指向的就是Husky对象。再判断 isinstance(h, Dog)Trueh虽然自身是Husky类型但由于Husky是从Dog继承下来的所以h也还是Dog类型。换句话说isinstance()判断的是一个对象是否是该类型本身或者位于该类型的父继承链上。因此我们可以确信h还是Animal类型 isinstance(h, Animal)True同理实际类型是Dog的d也是Animal类型 isinstance(d, Dog) and isinstance(d, Animal)True但是d不是Husky类型 isinstance(d, Husky)False能用type()判断的基本类型也可以用isinstance()判断 isinstance(a, str)True isinstance(123, int)True isinstance(ba, bytes)True并且还可以判断一个变量是否是某些类型中的一种比如下面的代码就可以判断是否是list或者tuple isinstance([1, 2, 3], (list, tuple))True isinstance((1, 2, 3), (list, tuple))True总是优先使用isinstance()判断类型可以将指定类型及其子类“一网打尽”。使用dir()如果要获得一个对象的所有属性和方法可以使用dir()函数它返回一个包含字符串的list比如获得一个str对象的所有属性和方法 dir(ABC)[__add__, __class__,..., __subclasshook__, capitalize, casefold,..., zfill]类似__xxx__的属性和方法在Python中都是有特殊用途的比如__len__方法返回长度。在Python中如果你调用len()函数试图获取一个对象的长度实际上在len()函数内部它自动去调用该对象的__len__()方法所以下面的代码是等价的 len(ABC)3 ABC.__len__()3我们自己写的类如果也想用len(myObj)的话就自己写一个__len__()方法 class MyDog(object):... def __len__(self):... return 100... dog MyDog() len(dog)100剩下的都是普通属性或方法比如lower()返回小写的字符串 ABC.lower()abc仅仅把属性和方法列出来是不够的配合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) # 有属性x吗True obj.x9 hasattr(obj, y) # 有属性y吗False setattr(obj, y, 19) # 设置一个属性y hasattr(obj, y) # 有属性y吗True getattr(obj, y) # 获取属性y19 obj.y # 获取属性y19如果试图获取不存在的属性会抛出AttributeError的错误 getattr(obj, z) # 获取属性zTraceback (most recent call last):File , line 1, in AttributeError: MyObject object has no attribute z可以传入一个default参数如果属性不存在就返回默认值 getattr(obj, z, 404) # 获取属性z如果不存在返回默认值404404也可以获得对象的方法 hasattr(obj, power) # 有属性power吗True getattr(obj, power) # 获取属性power fn getattr(obj, power) # 获取属性power并赋值到变量fn fn # fn指向obj.power fn() # 调用fn()与调用obj.power()是一样的81小结通过内置的一系列函数我们可以对任意一个Python对象进行剖析拿到其内部的数据。要注意的是只有在不知道对象信息的时候我们才会去获取对象信息。如果可以直接写sum obj.x obj.y就不要写sum getattr(obj, x) getattr(obj, y)一个正确的用法的例子如下def readImage(fp):if hasattr(fp, read):return readData(fp)return None假设我们希望从文件流fp中读取图像我们首先要判断该fp对象是否存在read方法如果存在则该对象是一个流如果不存在则无法读取。hasattr()就派上了用场。请注意在Python这类动态语言中根据鸭子类型有read()方法不代表该fp对象就是一个文件流它也可能是网络流也可能是内存中的一个字节流但只要read()方法返回的是有效的图像数据就不影响读取图像的功能。