python作为一种动态解释型语言,在实现各种框架方面具有很大的灵活性。

最近在研究python web框架,发现各种框架中需要显示的定义各种路由和Handler的映射,如果想要实现并维护复杂的web应用,灵活性非常欠缺。

如果内容以“约定即配置”的方式完成handler和路由的映射操作,可以大大增加python web框架的灵活性,此时动态映射是必不可少的。

在java mvc框架中,可利用反射机制,实现动态映射,而python也可以利用本身的特性,实现动态映射。

1、获得指定package对象(其实也是module)

为了遍历此包下的所有module以及module中的controller,以及controller中的function,必须首先获得指定的package引用,可使用如下方法:

__import__(name, globals={}, locals={}, fromlist=)加载package,输入的name为package的名字字符串

controller_package=__import__('com.project.controller',{},{},["models"])

ps:直接使用__import__('com.project.controller')是无法加载期望的package的,只会得到顶层的package-‘com’,除非使用如下方法迭代获得。

  1. def my_import(name):
  2. mod = __import__(name)
  3. components = name.split('.')
  4. for comp in components[1:]:
  5. mod = getattr(mod, comp)
  6. return mod

官方文档描述如下

When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned,not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned. This is done for compatibility with the bytecode generated for the different kinds of import statement; when using "import spam.ham.eggs", the top-level package spam must be placed in the importing namespace, but when using "from spam.ham import eggs", the spam.ham subpackage must be used to find the eggs variable. As a workaround for this behavior, use getattr() to extract the desired components.

2、遍历指定package下的所有module

为了获得controller_package下的module,可先使用dir(controller_package)获得controller_package对象范围内的变量、方法和定义的类型列表。然后通过

  1. for name in dir(controller_package):
      var=getattr(controller_package,name)
      print type(var)

遍历此package中的所有module,并根据约定的controller文件命名方式,发现约定的module,并在module中发现约定好的class。

如果name代表的变量不是方法或者类,type(var)返回的值为"<type 'module'>"。

3、遍历指定module中的class

依然使用dir(module)方法,只不过type(var)返回的值为"<type 'classobj'>"。

4、遍历指定class中的method

依然使用dir(class)方法,只不过type(var)返回的值为"<type 'instancemethod'>"或者<type 'function'>,第一种为对象方法,第二种为类方法。

5、遍历指定method中的参数名

使用method的func_code.co_varnames属性,即可获得方法的参数名列表。

以上方法,适合在python web运行前,对所有的controller提前进行加载,如果需要根据用户的请求再动态发现controller,依然可以使用上面的方法完成,只是会更加的简单,需要需找的controller路径已知,只需递归获得controller的引用即可,再实例化,根据action名,执行执行的action。

总结:主要使用的方法

__import__('name')、dir(module)、type(module)、getattr(module,name)

  1.  

python 动态加载module、class、function的更多相关文章

  1. Python 动态加载并下载"梨视频"短视频

    下载链接:http://www.pearvideo.com/category_1 import requests from lxml import etree import re from urlli ...

  2. python 动态加载类对象

    第一步 加载模块 module  =__import__("modulename",fromlist=['']) 第二部 加载类对象 cls = getattr(module, & ...

  3. Python 动态加载 Extension Manager Classes

    看着看着发现了一个库:stevedore(http://stevedore.readthedocs.org/en/latest/managers.html),但是感觉文档做得不行啊,都没个tutori ...

  4. __import__ 与动态加载 python module

    原文出处: koala bear    Direct use of __import__() is rare, except in cases where you want to import a m ...

  5. 黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

    一.AngularJS动态加载控制器和视图实例 路由配置关键代码: //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据 ...

  6. 动态加载js和css

    开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...

  7. JS动态加载 js css

    1.动态加载js function loadScript( url ){ var script = document.createElement( "script" ); scri ...

  8. 动态加载js,css(项目中需要的)

    最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...

  9. python基础-动态加载lazy_import(利用__import__)

    看了一天动态加载,普遍有这么几种方法,总结一下,由简入深,本文仅对查到的栗子们做个引用……省去你们大把查资料的时间= = 主要思想:把模块(文件)名.类名.方法名当成了变量 然后利用__import_ ...

随机推荐

  1. win32_11gR2_database安装教程

  2. ThinkPHP实现移动端访问自动切换主题模板

    ThinkPHP的模板主题机制,如果只是在PC,只要需修改 DEFAULT_THEME (新版模板主题默认是空,表示不启用模板主题功能)配置项就可以方便的实现多模板主题切换. 但对于移动端和PC端,也 ...

  3. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

  4. 使用SQL Server维护计划实现数据库定时自动备份

    在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库.要实现数据库的定 ...

  5. 【log4j2 加载配置文件】 加载配置文件的三种方法

    log4j 2读取的配置文件可以分为三类:src下的配置文件.绝对路径的配置文件.相对路径的配置文件. package com.herman.test; import java.io.File; im ...

  6. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  7. SPEL语言-Spring Expression Language

    Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts 2x中使用的OGNL表达式语言,能 ...

  8. ThreadLocal使用和原理

    实现机制 1.每个Thread对象内部都维护了一个ThreadLocalMap这样一个ThreadLocal的Map,可以存放若干个ThreadLocal. /* ThreadLocal values ...

  9. mvc-5视图和模版

    动态渲染视图 当待渲染的视图内容不多的时候,可以将视图元素放在控制器或者状态里 var views = document.getElementById("views"); view ...

  10. ZOJ2587 Unique Attack(判定最小割唯一性)

    看了题解,自己大概想了下. 最小割唯一的充分必要条件是残量网络中所有点要嘛能从源点floodfill到要嘛能floodfill到汇点. 必要性,这是当然的,因为假设从源点floodfill或者从汇点反 ...