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>

  • 相关阅读:
    对国内技术社区
    github访问慢
    MVC 框架搭建
    EntityFramework与Ado.net的对比——EF优势何在?
    什么是DTO ,DTO 有什么作用
    一些有趣的资源推荐
    解决sublime text 3使用Install Package时出现There are no packages available for installation问题
    基于CentOS7的服务器搭建(LAMP环境)
    Windows下UEFI环境的搭建
    Ubuntu16.04下搜狗输入法、Sublime Text 3的安装
  • 原文地址:https://www.cnblogs.com/mingaixin/p/2881113.html
Copyright © 2011-2022 走看看