lyzz1314

摘自谬雪峰: https://www.liaoxuefeng.com/wiki/1016959663602400/1017499532944768

isinstance()

isinstance([1, 2, 3], (list, tuple))
True

isinstance((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\'吗?
True

obj.x
9

hasattr(obj, \'y\') # 有属性\'y\'吗?
False

setattr(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

相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

栗子

分类:

技术点:

相关文章: