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
  • 相关阅读:
    ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
    Oracle Enterprise Linux 6.4 下配置vncserver
    Oracle Enterprise Linux 6.4 下挂载ISCSI 设备
    关于Solaris 的磁盘的分区
    【Google Earth】pro之视频录制
    【爱江山越野跑】ITRA积分认证流程
    android发送邮件
    android手机有多个摄像头,打开其中一个
    Android截图
    Android中的ACCESS_MOCK_LOCATION权限使用Demo
  • 原文地址:https://www.cnblogs.com/liliudong/p/9630403.html
Copyright © 2011-2022 走看看