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

    python是如何体现反射的:

    globals ()

    这个函数返回一个 map ,这个 map 的 key 是全局范围内对象的名字, value 是该对象的实例。

    在不导入任何 module 下,执行 globals ()的结果如下:

    >>> globals()
    {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

    在导入 sys 后,可以发现, globals ()返回的 map 中,多了 sys module 

    >>> import sys
    >>> globals()
    {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'sys': <module 'sys' (built-in)>, '__doc__': None, '__package__': None}

    再导入symllib

    >>> import sgmllib
    >>> globals()
    {'sgmllib': <module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__doc__': None}

    如果导入类后,在 map 中,可以找到类。

    >>> from sgmllib import SGMLParser
    >>> globals()
    {'sgmllib': <module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>, 'SGMLParser': <class sgmllib.SGMLParser at 0x7ffd7fa0aa70>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__doc__': None}

    所以,只要将 class 的名字最为 key ,即可得到 class 。如下:

    >>> globals()['SGMLParser']
    <class sgmllib.SGMLParser at 0x7ffd7fa0aa70>

    而如果要实例化一个对象,可以如下:

    >>> globals()['SGMLParser']()
    <sgmllib.SGMLParser instance at 0x7ffd7fe9ba28>

    这样,实现了类似 java 中, Class.forName () .newInstance() 的功能。但是,在使用 globals 函数之前,还需要导入相应的类,如果不导入,而直接使用 globals[‘...’] 查找这个类,则会抛出异常。

    所以,我在介绍一种可以动态导入的方法。

    首先,介绍一个函数 __import__, 这个函数传入的参数是 module 的名字,返回这个 module ,然后,在结合之前介绍过的 getattr ,于是,我们可以写出下面两句代码,实现对象的反射。

    >>> module=__import__('sgmllib')
    >>> module
    <module 'sgmllib' from '/usr/lib64/python2.6/sgmllib.pyc'>
    >>> parser =  getattr(module,'SGMLParser')()
    >>> parser
    <sgmllib.SGMLParser instance at 0x7ffd7fe9ba28>

  • 相关阅读:
    “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
    Web.Config全攻略
    C#常用的正则
    Asp.Net MVC2 Json
    webservice+Jquery返回Json格式【原创】
    JAVA线程池介绍以及简单实例
    从程序员到项目经理(17):你不是一个人在战斗思维一换天地宽
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    多表对应更新(跨服务器).sql
    sql导出excel.sql
  • 原文地址:https://www.cnblogs.com/mingaixin/p/2881113.html
Copyright © 2011-2022 走看看