OpenERP与Python 元编程
- 
[quote author=mrshelly link=topic=5771.msg14289#msg14289 date=1361832208] 
 校长. 我想如果使用 metaclass 是不是就是我一直想要的一个东西 的方向?
 我想根据一段代码(string) 生成一个 import 后的 module 对象?
 [/quote]
 哈哈,看看Tim Peters 的回答! “如果你拿不准是否应该用到它时,你不需要它“
 不过,好象真的用不到metaclass,下面的代码是不是你想要的? 但是,Python牛人们告诫我们,尽量不要用eval, exec等,那是既不安全又丑陋的,mrshelly就好这口没办法。code = """<br />x = 100<br />class A(object):<br />    def __init__(self, y):<br />        print('x=%s' % x)<br />        print('y=%s' % y)<br />        """<br />import imp<br />mymodule = imp.new_module('mymodule')<br />exec code in mymodule.__dict__<br /><br />In [41]: mymodule.A(2)<br />x=100<br />y=2<br />Out[41]: <mymodule.A at 0x2e6c110><br />
- 
刚刚又 Google 到一种方法 <br /><br />code = '''<br />x = 100<br />class A(object):<br />    def __init__(self, y):<br />        print('x=%s' % x)<br />        print('y=%s' % y)<br />'''<br />import types<br />m = types.ModuleType('test_m')<br />exec code in m.__dict__<br /><br />import sys<br />sys.modules['test_m'] = m<br />
 然后 import test_m 就OK了.
 总结一下, 就是 使用 imp.new_module 或者 types.ModuleType 可以生成一个 module object 然后 再给 这个 object 添加 代码里的方法,属性
 添加的方法, 主要使用 exec 来玩
 再记录一下, 由 pyc 文件加载的代码<br /><br />import marshal<br />import types<br /><br />b = open('test_m.pyc', 'rb').read()<br />code = marshal.loads(b[8:])<br />m = types.ModuleType('test_m')<br />exec code in m.__dict__<br /><br />sys.modules['test_m'] = m<br /><br />#test<br />import test_m<br /><br />
 除了 exec 不爽点之外. 其他比较完美...
 code object 似乎也只能使用 exec 来导入到模块 object 中...
- 
看了您的大作之后,欲罢不能,看了好几个小时代码,加上自己的理解。 
 也得一文 OpenERP 模块动态加载原理及启动代码分析 http://buke.github.com/blog/2013/02/26/openerp-dynamic-loading-and-booting-way/
 请斧正 ~ ;D
- 
[quote author=wangbuke link=topic=5771.msg14298#msg14298 date=1361879273] 
 看了您的大作之后,欲罢不能,看了好几个小时代码,加上自己的理解。
 也得一文 OpenERP 模块动态加载原理及启动代码分析 http://buke.github.com/blog/2013/02/26/openerp-dynamic-loading-and-booting-way/
 请斧正 ~ ;D
 [/quote]
 把真正的强人引出来了,@wangbuke是OpenERP中文社区贡献高质量代码最多的人,文档协作组织者之一,他的强文一定要看。我在文章里卖的那个“以后再讨论”的关子,buke已清晰表达,还有更多学习热点。
- 
mark 



 都是魔法师啊
 都是魔法师啊