摘自谬雪峰: https://www.liaoxuefeng.com/wiki/1016959663602400/1017499532944768
isinstance()
isinstance([1, 2, 3], (list, tuple))
Trueisinstance((1, 2, 3), (list, tuple))
True
总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
获取、判断是否有某个方法hasattr()
仅仅把属性和方法列出来是不够的,配合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\'吗?
Trueobj.x
9hasattr(obj, \'y\') # 有属性\'y\'吗?
Falsesetattr(obj, \'y\', 19) # 设置一个属性\'y\'
hasattr(obj, \'y\') # 有属性\'y\'吗?
可以传入一个default参数,如果属性不存在,就返回默认值:
getattr(obj, \'z\', 404) # 获取属性\'z\',如果不存在,返回默认值404
404
一个正确的用法的例子如下:
def readImage(fp):
if hasattr(fp, \'read\'):
return readData(fp)
return None
假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。
请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。
实例属性和类属性
什么是类属性:
class School(object):
name=\'Junior High\' # name 就是一个类属性
pass
什么是实例属性:
a = School(object):
a.name=\'Senior High\' # name 就是一个类属性
pass
相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
栗子