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因为那样的话只会增加实例属性而不是类属性
posted @ 2020-04-20 10:37  Bravo_Jack  阅读(285)  评论(0编辑  收藏  举报