面向对象进阶-反射

反射 -非常重要必须掌握 -适合任何语言

  • 反射是用字符串类型的名字操作变量
  • 函数eval()可以达到将字符串转换成可操作变量,但是存在安全隐患
  • 反射可以解决这种安全隐患

相关的方法

关于反射的内置函数

反射的四种方法getattr/setattr/hasattr/delattr

  • 获取getattr(类名, 字符串类型的变量名)

    1. 反射对象的属性 或 类的静态属性
    • 类.属性

        #创建一个老师类
        class Teacher():
        	dic = {'查看学生信息': '', '查看老师信息': ''}
        	
        ret = getattr(Teacher, 'dic')
        print(ret)
        #结果
        {'查看学生信息': '', '查看老师信息': ''}
      
    1. 反射对象中的方法 或 类中的静态方法
    • 类.方法

        #创建一个老师类
        class Teacher():
        	dic = {'查看学生信息': '', '查看老师信息': ''}
        	def func():
        		print('测试')
        	
        ret = getattr(Teacher, 'func')
        print(ret)
        #结果
        <function Teacher.func at 0x1045d8ae8>	#内存地址
      
    1. 反射模块里的属性

      • 假设存在模块mudule.py

      • 内置函数func()

          import mudule
          getattr(mudule, 'func')()	#这里直接运行该方法
        
    2. 反射模块里的方法

       pass
      
    3. 反射自己模块的方法和属性

       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
原文地址:https://www.cnblogs.com/liliudong/p/9630403.html