python的属性和方法
摘自谬雪峰: 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
相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
栗子🌰:
#实现调用时每声明一个实例,类属性计数增加1
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count+=1 # 此时不能用self.count因为那样的话只会增加实例属性而不是类属性