• Python Python中的反射机制


    Python中的反射机制

    by:授客 QQ1033553122

    概念

    借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

    module2.py

    #!/usr/bin/env python
    
    # -*- coding:utf-8 -*-
    
     
    
    __author__ = 'shouke'
    
     
    
    class TestClass:
    
        def __init__(self):
    
            pass
    
     
    
    def fun(self):
    
        pass
    
     
    

    module1.py

    1、不导入模块

    #!/usr/bin/env python

    # -*- coding:utf-8 -*-

     

    __author__ = 'shouke'

     

    if __name__ == '__main__':

        print(globals())

     

    运行结果

    运行结果:

    {'__author__': 'shouke', '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01F5C310>, '__name__': '__main__', '__builtins__': , '__package__': None, '__doc__': None, '__cached__': None, '__file__': 'F:/project/interface_project/module1.py'}

     

    说明:globals函数返回一个mapmap中的key是全局范围内对象的名字,value是该对象的实例

     

    2、导入模块

    修改module1.py代码如下

    #!/usr/bin/env python
    
    # -*- coding:utf-8 -*-
    
     
    
    __author__ = 'shouke'
    
    import  sys
    
     
    
    if __name__ == '__main__':
    
        print(globals())
    

     

    运行结果:

    {'__loader__': <_frozen_importlib.SourceFileLoader object at 0x01D9C310>, 'sys': , '__package__': None, '__builtins__': , '__author__': 'shouke', '__name__': '__main__', '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None}

     

    如上,新增了带颜色部分的内容

     

    3.导入类

    修改module1.py代码如下

    #!/usr/bin/env python
    
    # -*- coding:utf-8 -*-
    
     
    
    __author__ = 'shouke'
    
     
    
    from module2 import TestClass
    
     
    
    if __name__ == '__main__':
    
        print(globals())
    

     

    输出结果:

    {'TestClass': , '__package__': None, '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None, '__builtins__': , '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01DFC310>, '__author__': 'shouke', '__name__': '__main__'}

     

    如上,新增了带颜色部分的内容

     

    4、结合getattr,callable函数

    #!/usr/bin/env python
    
    # -*- coding:utf-8 -*-
    
     
    
    __author__ = 'shouke'
    
     
    
    from module2 import TestClass
    
     
    
    if __name__ == '__main__':
    
        # 动态获取类
    
        print('动态获取类:%s'% globals()['TestClass'])
    
    print('
    ')
    
     
    
        # 获取类的属性和函数
    
    print(dir(TestClass))
    
    print('
    ')
    
     
    
        print(getattr(TestClass,'fun'))  # 获取类的函数对象
    
        print(getattr(globals()['TestClass'](),'attr')) # 获取类实例的属性对象print('
    ')
    
     
    
        print(callable(getattr(TestClass,'fun')))    # 查看类的函数对象是否可调用
    
        print(callable(getattr(globals()['TestClass'](),'attr')))
    

     

    运行结果:

    动态获取类:

     

     

    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'fun']

     

     

    value

     

     

    True

    False

     

    说明:

    dir([object])

    不带参数,则返回当前作用域范围内的名称list。带参数则试图返回一个object的合法属性列表

     

    callable(object)

    返回True,如果对object为可调用,否则返回False。注意:类是可调用的(返回一个类实例),如果实例所属的类包含__call__()方法,那么实例也是可调用的

     

    getattr(object, name[, default])

    返回object对象名为name的属性的值

    name必须为字符串。如果nameobject对象的属性,那么返回属性的值,如getattr(x, 'foobar') 等同于x.foobar。如果name不存在,如果提供了default参数,则返回default。否则,抛出AttributeError

     

    globals()

    返回一个代表当前全局特征表的字典对象。总是显示当前模块的特征表字典(This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).

     

    结论

    通过以上globals,dir,callble,getattr等函数,可实现类似java的反射机制,可用于动态获取类,动态创建类对象,动态调用对象的方法等

     

     

  • 相关阅读:
    Windows 配置JAVA的环境变量
    不直接用NSLog
    Mongodb for Mac 安装
    Redis Mac 安装及简单命令使用
    第十五天和十六天学习笔记
    第十四天学习笔记
    第十三天学习笔记
    第十二天学习笔记
    第十一天学习笔记
    第十天学习笔记
  • 原文地址:https://www.cnblogs.com/shouke/p/10157772.html
Copyright © 2020-2023  润新知