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
  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/liliudong/p/9630403.html
Copyright © 2011-2022 走看看