一、isinstance(obj,cls)和issubclass(sub,super)
isinstance(obj,cls)检查obj是否是cls的对象
1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo)
issubclass(sub, super)检查sub类是否是 super 类的派生类
1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass 6 7 issubclass(Bar, Foo)
二、反射
1.什么是反射
主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
2.python面向对象中的反射:用过字符串的形式操作对象相关的属性。python中一切事物都是对象(都可以使用反射)
class Teacher: school='oldboy' def __init__(self,name,age): self.name=name self.age=age def teach(self): print('%s teach' %self.name) print(hasattr(Teacher,'school')) #检测是否含有属性 func=getattr(Teacher,'teach')) #获取属性
func() print(getattr(Teacher,'school',None)) # Teacher.x=123 setattr(Teacher,'x',123) #用字符串的方式添加属性 print(Teacher.x) delattr(Teacher,'school') #用字符串的方式删除属性 print(Teacher.school)
3.为什么用反射之反射的好处
好处一:实现可插拔机制
可以实现把主要的逻辑写好,然后后期再去实现接口的功能
好处二:动态导入模块
三、__setitem__,__getitem__,__delitem__
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) def __delattr__(self, item): print('del obj.key时,我执行') self.__dict__.pop(item) f1=Foo('sb') f1['age']=18 f1['age1']=19 del f1.age1 del f1['age'] f1['name']='alex' print(f1.__dict__)