• py 中反射的基本应用和总结


    #反射: 程序可以访问、检查和修改它本身的状态的行为的一种能力
    #python中在面向对象中的反射:通过字符串的形式操作对象相关属性,通过字符串让对象自检是否有字符串表示的属性。
    #python当中 反射提供的方法:hasattr/getattr/setattr/delattr

    1、hasattr:根据字符串的形式去某个模块判断是否存在某对象
    hasattr(obj, 'string') 让obj自省自检有没有和string名符合的属性,有返回True,没有返回False。

    2、getattr:根据字符串的形式去某个模块当中寻找某对象
    getattr(obj, 'string', None) 返回obj和string名相同的绑定方法。可以用来让一个变量引用这个返回结果,后面就可以call这个变量
    ,相当于call对象的绑定方法.如果没有,返回None,没有第三个参数则抛出异常

    3、setattr:根据字符串的形式去某个模块当中设置某对象
    setattr(obj, 'string', val) obj设置一个和string同名的的属性,并赋值为val。

    4、delattr:根据字符串的形式去某个模块当中删除某对象
    delattr(obj, 'string') 删除obj对象的‘string’的同名的属性。



    哪些对象可以使用反射:
    python中一切都是对象,都可以使用反射来进行自检
    1、类可以对类的共有属性,方法(绑定方法,非绑定方法)进行反射
    2、模块也可以进行反射。如:判定导入的模块是否有某个方法,有就调用。
    --->实际上,反射在java当中是很强大的东西,但是在python当中也可以使用,比如在一些关键字驱动的框架里面,就会有反射相关的应用

    例:=====================
    class People(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def speak(self):
            print('%s is speaking' % self.name)
    
    obj
    = People('qika', 18) f = input('qika:').strip() #strip()清除格式 if hasattr(obj, f): #hasattr 判断是否存在obj,f两个变量 getattr(obj, f)() func1 = getattr(obj, f) func1() else: print('名字:{} 说:{}'.format(obj.name, f))

    例:================================

    #对象应用反射
    class Foo:
        def __init__(self):
            self.name = 'qika'
            self.age = 18
        def func(self):
            print('hello')
    f = Foo()
    setattr(f,'sex','')   #设置一个属性("sex","男")
    print(f.sex)   #打印一下里面的这个属性。其中的f是自己定义的变量,用来接收Foo()类实例化;然后直接调用属性:f.sex
    delattr(f,"sex")  #同上,这里进行“删除一个属性”
    
    hasattr(f,'name')  #同上,判断name属性是否存在
    if hasattr(f,'func'):  #连着一起使用:判断是否存在
         getattr(f,'func')()    #查找f(即Foo类实例化的接收的变量名)内这个func这个属性方法
    else:
        print('没找到')

    例:=================================

    #类中的反射
    
    class Foo:
        f = 123
        @classmethod
        def class_method_dome(cls):
            print('class_method_dome')
    
         @staticmethod
        def static_method_dome():
            print('static_method_dome')
    
    
    print(hasattr(Foo,'class_method_dome'))
    method = getattr(Foo,'class_method_dome')
    method()
    print('------------')
    print(hasattr(Foo,'static_method_dome'))
    method1 = getattr(Foo,'static_method_dome')
    method1()



  • 相关阅读:
    JavaBean对象与Map对象互相转化
    PowerDesigner V16.5 安装文件 及 破解文件
    eclipse get set 自动添加注释
    严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
    java poi excel操作 把第一列放到最后去
    java poi excel操作 下拉菜单 及数据有效性
    maven 项目编译失败
    关于TbSchedule任务调度管理框架的整合部署
    mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析
    tomcat启动问题,卡在 preparing launch delegate 100% 的解决方法
  • 原文地址:https://www.cnblogs.com/QiKa/p/13510515.html
Copyright © 2020-2023  润新知