zoukankan      html  css  js  c++  java
  • 面向对象进阶-反射

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

    • 反射是用字符串类型的名字操作变量
    • 函数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
  • 相关阅读:
    python3.x学习笔记2018-02-05更新
    网络安全学习资源整理2018-02-02更新
    隔行变色效果
    自制滚动条
    关于ico图标
    CSS实现标题/段落省略效果的三剑客
    第三章(循环) 编程题 2
    第三章(循环) 编程题
    python基础03--基本数据类型(字符串)
    python基础02--运算符与基本数据类型(数字)
  • 原文地址:https://www.cnblogs.com/liliudong/p/9630403.html
Copyright © 2011-2022 走看看