当前位置: 首页 > 编程日记 > 正文

OpenERP与Python 元编程

Python元编程被称为“黑魔法”。Python界的传奇人物Tim Peters有云:

引用

Python的元编程这种黑魔法99%的人都无需了解,如果你拿不准是否应该用到它时,你不需要它.

OpenERP基本遵循了Tim Peters的教诲,但是却在6.1版本之后忍不住触及了一点点,从此游走于黑白两道之间:)
其实OpenERP中用到的元类(MetaClass)作用非常简单:就是在V6.1后我们在模块中所定义的实体类,不需要进行实例化,比如
OpenERPV6.1之前的实体类定义:

程序代码: [选择]

Class MyProduct(osv.osv):     _inherit="product.product"     pass
MyProduct()

在OpenERPV6.1之后则不需要上面的类的实例化过程了。即,不需要下面这句了:

程序代码: [选择]

MyProduct()

为了了解元类如何实现取消实例化过程,首先我们来看一下OpenERP中实体类的实例化过程到底做了些什么。
我们一般知道,Python类的调用或称为实例化,会生成该类的一个实例对象(instance object),比如:

程序代码: [选择]

class A(object):    ...:     def __init__(self, x):    ...:         self.x = x    ...:          In [2]: a = A(2)In [3]: a
Technorati 标签: Openerp, Python, 元编程
Out[3]: <__main__.A at 0x2ff2fd0>

a就是类A的一个实例对象。这是Python的基础知识,很好理解。但是,我要告诉你的是:在OpenERP中,MyProduct()并不产生MyProduct类的实例,甚至再深究的话,我们经常在代码中用到的pool.get('product.product')从对象池中获取的实例对象,也非这个MyProduct类所生成的实例。
这到底是怎么一回事?我们首先要了解什么是类的实例化,或者类的调用到底是怎样的一个过程,比如上例中A(2),其实其执行过程基本上可以分为两个部分,用Python 来表示就是:

程序代码: [选择]

n = A.__new__(A, 2)      #创建类的实例对象
if isinstance(n, A): A.__init__(n, 2)     #实例对象初始化

类A本身并没有定义__new__类方法,所以直接调用其父类即:object的__new__方法获得实例对象,如果获得的对象是A的实例则执行__init__方法
同样的,Myproduct所继承的osv.osv类(或OE6.1以后称为BaseModel)就有一个__new__方法,而这个方法返回的是None,所以按照上面的说明它都不会运行到实例初始化的部分,当然也就无法获得Myproduct的实例。
如果我们仔细分析代码,发现这个__new__的主要作用基本上就是下面这点代码:

程序代码: [选择]

        module_model_list = MetaModel.module_to_models.setdefault(cls._module, [])         if cls not in module_model_list:             if not cls._custom:                 module_model_list.append(cls)

其实MetaModel是一个元类(metaclass)等会儿要讲到,module_to_models则是这个类上的一个变量,其对应一个字典,字典的key对应每一个“模块”就是OpenERP的addons,其值对应这个模块中所定义的实体类(比如我们上例中的MyProduct)
所以调用实体类并没有实例化,只是就这样登记备案了一下,事实上只有在模块载入(loading)过程中才会对所注册的实体类实例化,其实也不是一般意义的实例化,而是要另外创造一个新类,再做实例化。(这部分以后有空再介绍)
那么问题回到原点,OpenERPV6.1以后如何做到,不调用实体类,即不运行BaseModel上的__new__方法就可以做到上述的类的注册过程。把OpenERP变色的那一点黑,这就出现了。对,就是那个叫MetaModel的家伙。在介绍MetaModel之前我们先快速的讲解一下Python的metaclass。
在Python中一切皆为“对象”, 类的实例是对象,类本身也是对象。类的实例对象是通过对类的调用获得的,那么类本身这个对象又是如何获得的呢?
其实上面的例子中类A的定义可以改写为:

程序代码: [选择]

A = type('A', (object,), {'__init__': lambda self,x: self.x=x})

从上面的代码可以看出类A是通过调用type,或者是通过对type的实例化来获得的,事实上默认情况下所有的类都是由type实例化获得,这个type类就是所生成类的元类。
类的实例对象可以对应五花八门我们定义的各种类,同理,我们是否可以定义除type以外用来生成类对象的五花八门的元类呢?答案当然是肯定的。看看我们的MetaModel:

程序代码: [选择]

class MetaModel(type):     ....

它与我们的普通的类定义没有什么差别,唯一需要注意的是其继承的父类是‘type',
而在OpenERP所有的实体类的基类BaseModel的类定义中有这么一句:

程序代码: [选择]

__metaclass__ = MetaModel

这句有特殊的含义,表示该类对象将由元类MetaModel实例化生成。在Python3.x中则用如下的语法:

程序代码: [选择]

Class MyProduct(metaclass=MetaModel, osv.osv)

还记得上面提到的类的实例化,__new__, __init__两步,元类的实例化也是一样。
我们看到MetaModel的__init__方法与上面提到的BaseModel类的__new__方法中有完全类似的代码:

程序代码: [选择]

        if not self._custom:             self.module_to_models.setdefault(self._module, []).append(self)

就是做了一个注册备案的动作。所以类对象本身产生的过程就已经注册了类,可以不用和6.0及以前版本的OpenERP每次定义实体类都要调用一下了。

« 最后编辑时间: 二月 25, 2013, 07:02:00 下午 作者 digitalsatori »

OpenERP高级实施顾问
上海先安科技 (http://cn.openerp.cn)
tony AT openerp.cn
021 50323731

转载于:https://my.oschina.net/tomora/blog/167256

相关文章:

联手中科大、浙大、华科大等高校,阿里研发4项最新AI安全技术

随着互联网技术对抗环境日益复杂化&#xff0c;各大网络平台页面可供用户上传并做展示的内容&#xff0c;都可能面临恶意攻击&#xff0c;例如黑灰产团伙会发布色情等不良图片和视频&#xff0c;以及发布可能涉嫌抄袭侵权的商品或其他违规信息&#xff0c;甚至一些黑灰产团伙还…

联想S820 MIUI刷机包 MIUI 4.4.30 流畅执行 在线主题破解

ROM介绍 破解免费使用MIUI全部主题(方法&#xff1a;开机开启Root权限&#xff0c;进入WSM工具箱→安装二进制文件→重新启动→再次进入WSM工具箱→两个工具打上勾→重新启动)&#xff0c;然后尽情奔放吧 .加入V4A音效 .加入安卓4.4切换特效 .加大外放音量。不爆音 .集成 WSM …

列表框操作函数集合

1 /*列表框互相操作函数集 */23// 描述: 添加不重复列表框元素4functionselAdd( srcList, dstList )5 {6varselectedIndex newArray();7varcount 0 ;89for( i0 ; i < srcList.options.length; i ){1011if( srcList.options[i].selected ){1213selectedIndex[count] i;14…

看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画

作者 | 神经小兮来源 | HyperAI超神经头图 | 下载于视觉中国把影视剧变成漫画&#xff0c;是怎样的一种神操作&#xff1f;来自大连理工大学和香港城市大学的团队&#xff0c;最新提出的 AI 框架&#xff0c;可自动将影视剧转换为漫画。从此&#xff0c;观影追剧又多了一种打开…

跨越企业的“中等收入陷阱”

在国际经济学中&#xff0c;有一个“中等收入陷阱”的概念&#xff0c;含义为&#xff1a;新兴市场国家突破人均GDP1000美元的“贫困陷阱”后&#xff0c;很快会奔向1000美元至3000美元的“起飞阶段”&#xff1b;但到人均GDP3000美元附近以后&#xff0c;快速发展中积聚的矛盾…

docker 数据卷与容器卷

2019独角兽企业重金招聘Python工程师标准>>> 容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;Data Volumes Dontainers&#xff09; 数据卷 使用-v可以挂载一个本地的目录到容器中作为数据卷。 [root…

document.all与WEB标准

1、DOM  WEB标准现在可真是热门中热门&#xff0c;不过下面讨论的是一个不符合标准的document.all[]。DOM&#xff0d;&#xff0d;DOCUMENT OBJECT MODEL文档对象模型&#xff0c;提供了访问文档对象的方法.例如文档中有一个table,你要改变它的背景颜色&#xff0c;那就可…

终于有人把Python讲清楚了!

经常有人问我&#xff0c;Python初学者该怎么学好Python&#xff1f;其实从事Python开发的这些年中&#xff0c;我见过很多相关的教程和书籍&#xff0c;他们大都这样讲 &#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处…

开源 免费 java CMS - FreeCMS1.5-建站向导

2019独角兽企业重金招聘Python工程师标准>>> 下载地址&#xff1a;http://code.google.com/p/freecms/ 建站向导 从FreeCMS 1.5开始支持 为了方便用户创建站点&#xff0c;系统提供了建站向导功能。 从左侧管理菜单点击建站向导进入。 第一步&#xff1a;创建…

Python实战之网络编程socket学习笔记及简单练习

sk socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一&#xff1a;地址簇 socket.AF_INET IPv4&#xff08;默认&#xff09; socket.AF_INET6 IPv6 socket.AF_UNIX 只能够用于单一的Unix系统进程间通信 参数二&#xff1a;类型 socket.SOCK_STREAM 流式socke…

用IE重起计算机或者关机

<script language"JavaScript"> var Applicationnew ActiveXObject(Shell.Application.1); </script> <button οnclickApplication.ShutdownWindows();>关机</button><br> <button οnclickApplication.Suspend();>挂起</bu…

系统故障分析和排查

日志的功能 用于记录系统、程序运行中发生的各种事件通过阅读日志&#xff0c;有助于诊断和解决系统故障日志文件的分类内核及系统日志由系统服务syslog统一进行管理&#xff0c;日志格式基本相似用户日志记录系统用户登录及退出系统的相关信息程序日志由各种应用程序独立管理的…

用数据分析《你好,李焕英》“斐妈”爆红的真相

作者 | 俊欣来源 | 数据分析与篮球头图 | 下载于视觉中国《你好&#xff0c;李焕英》成为了春节档最热门最火爆的电影之一。截止目前&#xff0c;根据猫眼电影专业版的数据显示&#xff0c;该影片的票房已经突破了43亿&#xff1b;在抖音搜索上&#xff0c;因为其“好哭”而冲上…

[转] Android开发之如何保证Service不被杀掉(broadcast+system/app)

转发&#xff1a;原文链接http://blog.csdn.net/mad1989/article/details/22492519 序言 最近项目要实现这样一个效果&#xff1a;运行后&#xff0c;要有一个service始终保持在后台运行&#xff0c;不管用户作出什么操作&#xff0c;都要保证service不被kill&#xff0c;这可真…

如何使得按确定和取消按纽转到两个不同的页面!

问&#xff1a; 如何使得按确定和取消按纽转到两个不同的页面&#xff01; confirm(),后面的具体参数是什么&#xff1f; ______________________________________________________________________________________________ 答1&#xff1a; 看个例子吧&#xff01; <scrip…

PHP函数学习nl2br(),strlen(),mb_strlen()

2019独角兽企业重金招聘Python工程师标准>>> 1 nl2br($str): 注意&#xff1a;n之后的是字母L的小写&#xff0c;不要当做数字1. 函数作用&#xff1a;在$str中的每个新行(\n)之前插入HTML换行符( <br/> ) 示例&#xff1a; echo nl2br("One line.\nAnot…

携手中国电信、中国联通,华为正式发布首个5G超级刀片站 A+P 2.0天线商用网络

近日&#xff0c;在2021 MWC 上海期间&#xff0c;中国电信、中国联通携手华为发布首个5G超级刀片站 AP 2.0天线商用网络。 中国电信5G共建共享工作组高级项目经理李志军分享中国电信部署AP 2.0后的商用体验。AP 2.0颜值与实力兼备&#xff0c;解决了无空间部署5G以及5G挂高低…

『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

亲爱的读者们,你们好 !年底将近,分享从过去一年你最喜欢的技巧和建议作为礼物送给新手们。提交你的最喜欢的迅速或objc琐事,实用的提示,意外的发现,实用的解决方法,没用的迷恋,或不论什么其它你认为今年非常酷。就在以下写下你的评论! 笔者分享总结例如以下(本篇会不定期进行更…

一口一个,超灵活的Python迷你项目

来源 | 法纳斯特责编 | 寇雪芹头图 | 下载于视觉中国在使用Python的过程中&#xff0c;我最喜欢的就是Python的各种第三方库&#xff0c;能够完成很多操作。下面就给大家介绍22个通过Python构建的项目&#xff0c;以此来学习Python编程。大家也可根据项目的目的及提示&#xff…

说说大型高并发高负载网站的系统架构【转】

我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载和并发的解决方案上有一些…

DataGrid 的 全选/取消全选 控制(CheckBox)

DataGrid控件: <Columns> <asp:TemplateColumn> <HeaderStyle Width"10px"></HeaderStyle> <HeaderTemplate> <INPUT id"CheckAll" name"CheckAll" type"checkbox"…

k8s入门系列之介绍篇

Kubernetes介绍1.背景介绍  云计算飞速发展    - IaaS    - PaaS    - SaaS  Docker技术突飞猛进    - 一次构建&#xff0c;到处运行    - 容器的快速轻量    - 完整的生态环境2.什么是kubernetes  Kubernetes(k8s)是Google开源的容器集群管理系…

元宵节就要到了,花灯要不要来一盏?3D的那种

又是一年元宵佳节&#xff01;我国各地庆祝元宵节的方式很有讲究&#xff0c;有的地方吃汤圆&#xff0c;一个个软糯香圆&#xff1b;有的地方办灯展&#xff0c;十分热闹。当然&#xff0c;疫情当下&#xff0c;为了大家的安全&#xff0c;不建议线下聚众集会。但是&#xff0…

Android Timer的使用

1&#xff1a;服务端使用PHP <?phpecho date(Y-m-d H:i:s); ?> 2&#xff1a;activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…

屏蔽相应键盘按钮

<script language"Javascript"><!-- //屏蔽鼠标右键、CtrlN、ShiftF10、F11、F5刷新、退格键 //Author: meizz(梅花雨) 2002-6-18 function document.oncontextmenu(){event.returnValuefalse;}//屏蔽鼠标右键function window.onhelp(){return false} //…

MySQL查询缓存

2019独角兽企业重金招聘Python工程师标准>>> MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存&#xff0c;MySQL 会立刻返回结果&#xff0c;跳过了解析、优化和执行阶段。 查询缓存系统会跟踪查询涉及查询中的每个表&#xff0c;如果这些表发生变化&#…

事半功倍系列 javascript

清华大学出版的《事半功倍系列 javascript》,本人照着书敲出来的,有些翻译了一下.前几年看了一下,最近无事,重新翻了翻,很有帮助.本书应该有光盘的,但学校的书,光盘不知在哪.希望对你学 javascript有帮助 第一章javascript简介 1.在地址栏输入javascript语句 Javascript:Doc…

Golang 本地帮助文档

2019独角兽企业重金招聘Python工程师标准>>> godoc -http:8000 url: http://127.0.0.1:8000 转载于:https://my.oschina.net/koalaone/blog/169626

2021版Java知识体系详解!(赠视频)

本篇文章是我们整理的一份架构师的成长路线&#xff0c;包括了并发编程、设计模式、常用框架、中间件、微服务与分布式、常用工具、JVM、MySQL、数据结构与算法&#xff0c;还有架构师精选视频、架构师成长路线高清大图。又是新的一年&#xff0c;每一年都会有人在成为架构师的…

【6】font-size 字体属性

font-style -- 字体风格font-variant -- 小型大写字母文本font-weight -- 文本的粗细font-size/line-height -- 大小/行高font-family -- 字体常用格式&#xff1a; fo…