• 面向对象进阶-反射


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

    • 反射是用字符串类型的名字操作变量
    • 函数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
  • 相关阅读:
    linux cpu load学习笔记
    P1064 金明的预算方案
    P1757 通天之分组背包
    P1352 没有上司的舞会
    P1651 塔
    P1250 种树
    P1938 [USACO09NOV]找工就业Job Hunt
    P4392 [BOI2007]Sound 静音问题
    P3884 [JLOI2009]二叉树问题
    P2880 [USACO07JAN]平衡的阵容Balanced Lineup
  • 原文地址:https://www.cnblogs.com/liliudong/p/9630403.html
Copyright © 2020-2023  润新知