对于python学者来说,这个self肯定不陌生,每次使用都是像固定格式似的,知道是那么写,但是这个self到底是什么呢?首先了解一下概念和在python中的使用,再看它在odoo中的使用。
一、基本概念
-
普通函数、类方法
python中的函数都知道,在面向对象中,我们将类中定义的函数称为方法。
类的方法与普通的函数只有一个特别的区别——类方法中必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
注意:按照惯例它叫self,说明这个self名称不是必须的,你可以定义成a或b或其它名字都可以,在python中self不是关键词,但是约定成俗,为了让广大程序猿都好理解,一般就定义为self。
-
类、实例、对象
以下定义了一个Myclass类,类中定义了一个f()方法,创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。即创建实例是通过类名+()实现,对象=类(参数)。
也可以给实例变量绑定属性,比如:为 x绑定 name 属性,i也是类的属性
二、Self在Python中的使用
我们虽然可以像上面那样给类的实例对象绑定属性,但是不够方便。在python中,类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,并且该方法有参数,参数可以通过__init__() 传递到类的实例化操作上,我们可以通过传参数的这种形式绑定属性。
__init__ 方法的第一个参数永远是 self ,表示创建的实例本身,因此,在 __init__ 方法的内部,就可以把各种属性绑定到 self。而且在类中函数的相互调用也是要加self的,比如上面例子中的sq()。
self代表类的实例,而非类;self 就是 对象/实例 属性集合,没有属性这个self也存在。
通俗的说,这个self就是其中一个房间(init)的一个钥匙,房间里面放了很多东西(变量)这个房间就是函数init。self可以改成任何的词。在其他函数中有self这个钥匙,所以凡是有self的函数就可以调用init房间的东西(变量)。
三、Self在Odoo中的使用
在odoo中经常可以看到self.env,self.env.cr等等,那么这些又是什么?怎么使用呢?
Odoo中使用的self,是对 游标cr、用户ID、模型、上下文、记录集、缓存 的封装。我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr、self.uid。
env是环境,储存了模型的缓存记录集,因此我们可以通过环境来获取、增加、修改、删除记录,而触发数据库更改,从而达到操作数据库的目的。
self.env | 提供对请求参数和其他有用的访问 |
self.env.cr 或 self._cr | 数据库的游标对象,可用于对数据库的操作 |
self.env.user | 访问当前用户,当前用户的记录 |
self.env.context 或 self._context | 上下文字典 |
self.env.ref(xml_id) | 返回对应于XML id的记录 |
self.env[model_name] | 返回给定模型的实例 |
目前我最常使用到的一个普通查询:
-
self.search(domain) //从当前模型的self中查询
-
self.env['model'].search(domain) // 获取某个model的环境,查询其中的记录集