• python面向对象中反射


    反射的定义:

      用字符串数据类型的变量名来访问这个变量的值

    python面向对象中的反射,通过字符串的形式操作对象相关的属性.

    python中一切都是对象(都可以使用反射)

    反射的方法:

      getattr 获取属性

       hasattr  检测是否函数某属性

      setattr 设置属性

      delattr  删除属性

    class Foo:
        f = "类的静态变量"
        def __init__(self,name,age): # 初始方法
            self.name = name
            self.age =age
        def say_hi(self):  # 函数,方法
            print("hi,%s" %self.name)
    obj = Foo("zhao",18)
    
    #检测是否由某属性
    print(hasattr(obj,"name"))
    #检测obj这个对象里面有没有name这个属性
    print(hasattr(obj,"say_hi"))
    #检测obj这个对象里面有没有say_hi这个方法
    
    # 获取属性
    n = getattr(obj,"name")
    print(n)
    func = getattr(obj,'say_hi')
    func()
    
    # print(getattr(obj,"aaa"))  # 不存在这个属性或者方法的话,直接报错
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,"show_name",lambda self:self.name + "帅哥")
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    #删除属性
    delattr(obj,"age")
    delattr(obj,"show_name")
    print(obj.__dict__)

    类也是对象:

    class Foo:
        staticField = 'old boy'
    
        def __init__(self):
            self.name = "zhaoyang"
        def func(self):
            return  "func"
        @staticmethod
        def bar():
            return 'bar'
    print(getattr(Foo,'staticField'))
    print(getattr(Foo,'func'))
    print(getattr(Foo,'bar'))

    反射当前模块成员

    import sys
    
    
    def s1():
        print 's1'
    
    
    def s2():
        print 's2'
    
    
    this_module = sys.modules[__name__]
    
    hasattr(this_module, 's1')
    getattr(this_module, 's2')

    导入其他模块,利用反射查找该模块是否存在某个方法

    def test():
        print('from the test')
    """
    程序目录:
        module_test.py
        index.py
     
    当前文件:
        index.py
    """
    
    import module_test as obj
    
    #obj.test()
    
    print(hasattr(obj,'test'))
    
    getattr(obj,'test')()

      

  • 相关阅读:
    JavaScript面试库
    JS事件委托的原理和应用
    缓存ABC
    网络模型探究
    持续集成配置之Nuget
    angular应用容器化部署
    微服务随想
    .NET性能优化小技巧
    博客园博客小优化
    Emmet 简介
  • 原文地址:https://www.cnblogs.com/zhaoyang110/p/9392954.html
Copyright © 2020-2023  润新知