面向对象进阶-反射

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

  • 反射是用字符串类型的名字操作变量
  • 函数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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值