一、isinstance(obj, cls) 和 issubclass(sub, super)
isinstance() 检查obj是否是类的实例化
class Foo(object): pass obj = Foo() isinstance(obj, Foo) >>>True
issubclass() 检查sub类是否是super 类的派生类
class Foo(object): pass class sub(Foo): pass issubclass(sub, Foo) >>>True
二、反射
说明:指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
python面向对象的反射:通过字符串的形式操作对象的相关属性。python中的一切事物都是对象(都可以使用反射)
Python实现自省的4个函数:
# #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func')
# #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')
三、反射的魔法方法
__setattr__ , __delattr__ , __getattr__
class Foo: x = 1 def __init__(self, y): self.y = y def __getattr__(self, item): print "你要找的属性不存在" def __setattr__(self, key, value): #self.key = value 如果写成这样,就变成了无限递归了,不能这么写 self.__dict__[key] = value def __delattr__(self, item): del self.item #写成这样就变成了无限递归,不能这么写 self.__dict__.pop(item) 1.#__setattr__:当添加或者修改属性时,会触发它的执行 f1 = Foo(10) print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行。你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值 f1.z = 3 触发__setattr__方法 print(f1.__dict__) 2. __delattr__ 删除属性的时候会触发 del f1.z 删除属性 3.__getattr__ 只有在调用属性或者被调用属性且属性不存在时触发 f1.bbbb
四、二次加工标准的数据类型
class List(list): def append(self, p_object): #添加类型检查功能,比原生的list多了个检查步骤 if not isintance(p_object, int): raise TypeError('这个数值不是 int 类型') super().append(p_object) @property def mid(self): #新增自己的属性 index = len(self)//2 return self[index] 取列表的总长度除以2的值作为下标的元素 test = List([1,2,3]) >>>[1,2,3] test.append(4) >>>[1,2,3,4] test.mid >>>2 #其余的方法都继承list的 test.insert(0,-123) 将下标为0的元素替换成-123 >>>[-123,2,3,4] test.clear() 清空这个列表 >>> []