zoukankan      html  css  js  c++  java
  • python中的“反射”

    python中的反射

    反射

    • 原理:在python中万物皆对象,对象中的所有的属性和方法都是通过字典形式保存的,如果我们想获得对象中的某个属性或方法只需要:
      1. 首先获得该对象的所有属性和函数的字典
      2. 通过键key的索引获取相应的值
    
    class A:
        def __init_(self, name):
            self.name = name
        
        def func(self):
            pass
    
    a = A('a)    
    setattr(a, 'age', 10)
    getattr(a, 'sex', '没有找到')
    hasattr(a, 'age')
    delattr(a, 'age')
    
    # 当我们想通过一个字符串操作对象中的同名的方法时,我们就可以通过attr相关的函数操作
    msg = input('please enter a method name:') # 在这里,如果我们输入 'func',然后向往常一样调用a.msg,那么就会报错说a中没有msg这个参数,而不是我们想象中的a.func,另外一种情况就是:a.'func'(),这显然也不行,因为对象中的func是一个变量,指向一块内存空间。
    # 当我们应用反射技术时,就可以实现
    # 形式1
    if hasattr(a, msg):
        getattr(a, msg)()
    else:
        print('not find')
    
    # 形式2
    getattr(a, msg, 'not find')
    
    
    # 推荐使用形式1
    
    
    
    
    def fun():
        pass
    
    
    def foo():
        pass
    
    
    # 应用, 通过反射的思想调用上面定义的函数,正常情况下直接:func()
    methodName = input('please enter method name:')
    # 方法1
    import sys
    obj = sys.__modules__['__main__]
    if hasattr(obj, methodName):
        getattr(obj, methodName)
    else:
        print('not find')
    # 方法2,先通过globals()获取当前模块的所有属性和函数的字典,然后通过函数名字的索引获取相应的地址,再调用函数
    globals()[methodName]()
  • 相关阅读:
    Xcode-调试断点不能停在代码区终极解决方案
    iOS-修改Status Bar
    iOS-appStore发布流程
    iOS-Debug调试
    iOS-项目搭建
    iOS-UIButton-设置button标题和图片位置
    iOS-布局-Masonry-优先级
    intent 传参数
    五大布局
    execute、executeQuery和executeUpdate之间的区别
  • 原文地址:https://www.cnblogs.com/JonnyJiang-zh/p/13920744.html
Copyright © 2011-2022 走看看