反射 -非常重要必须掌握 -适合任何语言
- 反射是用字符串类型的名字操作变量
- 函数
eval()
可以达到将字符串转换成可操作变量,但是存在安全隐患 - 反射可以解决这种安全隐患
相关的方法
关于反射的内置函数
反射的四种方法getattr
/setattr
/hasattr
/delattr
-
获取
getattr(类名, 字符串类型的变量名)
- 反射对象的属性 或 类的静态属性
-
类.属性
#创建一个老师类 class Teacher(): dic = {'查看学生信息': '', '查看老师信息': ''} ret = getattr(Teacher, 'dic') print(ret) #结果 {'查看学生信息': '', '查看老师信息': ''}
- 反射对象中的方法 或 类中的静态方法
-
类.方法
#创建一个老师类 class Teacher(): dic = {'查看学生信息': '', '查看老师信息': ''} def func(): print('测试') ret = getattr(Teacher, 'func') print(ret) #结果 <function Teacher.func at 0x1045d8ae8> #内存地址
-
反射模块里的属性
-
假设存在模块
mudule.py
-
内置函数
func()
import mudule getattr(mudule, 'func')() #这里直接运行该方法
-
-
反射模块里的方法
pass
-
反射自己模块的方法和属性
import sys #导入sys模块 #当前模块名用sys.modules['__main__'] setattr(sys.modules['__main__'], 'func')
-
判断
hasattr(类名, 字符串类型方法名)
-
结合
getattr()
使用class Teacher(): dic = {'查看学生信息': 'show_student'} def show_student(self): print('小明今年五岁了') #实例化老师 alex = Teacher() #循环获得dic的key值 for i in Person.dic: print(i) #打印的结果是'查看学生信息' #判断 if hasattr(alex, Teacher.dic[i]) #判断alex中有没有show_student这个变量名 ret = getattr(alex, Teacher.dic[i]) 获取这个变量名的内存地址 ret() #调用这个变量名对应的方法,得到结果小明今年五岁了
-
-
设置
setattr
class A(): pass a = A() setattr(A, 'name', 'dog') #给A类设置一个静态属性名为name,值为dog setattr(a, 'name', 'cat') #给对象a设置一个属性名为name, 值为cat
-
删除
delattr
delattr(A, 'name') #删除A的静态属性name delattr(a, 'name') #删除a的属性name