反射
反射(1)
# 反射 # python中一切皆对象,类也是一个对象 # 平时我们有可能遇见这么一情况,一个字符串'name',我们经常想通过这个字符串'name'直接就拿到变量name的值 # 三个内置函数,反射相关,根据字符串格式的属性或方法,得到实际存在的属性值和方法 # hasattr # 判断一个对象的某个属性有没有,有返回True # getattr # 参数为对象名与字符串数据类型的变量名。 可以得到该对象命名空间中该字符串值对应的变量值 # 获取一个对象的属性或方法 # delattr class Teacher: dic = {'查看学生信息':'', '查看讲师信息':''} def show_student(self): print('show_student') def show_teacher(self): print('show_teacher') @classmethod def func(cls): print('hhaa') if hasattr(Teacher, 'dic'): # 判断Teacher中有没有dic属性 ret = getattr(Teacher, 'dic') # 得到Teacher中的dic属性值 print(ret) # {'查看讲师信息': '', '查看学生信息': ''} ret2 = getattr(Teacher, 'func') # 得到Teacher中的func方法,可以通过ret2()调用 ret2() # hhaa t = Teacher() if hasattr(t, 'show_student'): ret3 = getattr(t, 'show_student') ret3() # show_student
反射(2)
# 补充的两个内置函数isinstance和issubclass #isinstance # 判断类与对象的关系 #isinstance(obj, cls) # 检查obj是否是类cls的对象 # issubclass # 判读类与类的关系 # issubclass(sub, super)检查sub类是否是super类的派生类(子类) # 反射是一个非常非常重要的知识点 # 反射:是用字符串类型的名字去得到变量 # hasattr # getattr # setattr # 设置修改变量 # setattr(a, 'name', 'nezha') 给a设置了一个属性name,值是nezha # delattr # 删除一个变量 # 可以反射类的属性和方法 # 可以反射模块的属性和方法 # 可以反射对象的属性和方法 # 可以反射自己的模块的方法和属性 # getattr(sys.modules[__name__], '变量名') # 可反射内置模块的方法和属性 # 反射对象中的属性和方法 class A: def func(self): print('in func') @classmethod def func1(self): print('in func1') a = A() # 反射的方式增加属性,一般不用 setattr(a, 'name', 'alex') # 给a设置了一个属性name,值是alex # 反射对象的属性 if hasattr(a, 'name'): # 判断a对象是否有name属性 print(getattr(a, 'name')) # 'alex' # 使用反射做删除,很危险,用的很少 delattr(a, 'name') # 删除a中name属性 # 反射对象的方法 if hasattr(a, 'func'): ret = getattr(a, 'func') ret() # in func # 反射类的方法 ret = getattr(A, 'func1') # 得到类的方法,func1 ret() # in func1 # 反射模块的属性 # 反射模块中的方法