所以本质上, 函数和办法的差别是: 函数是属于 FunctionObject, 而 办法是属 PyMethodObject
简单来看下代码:
- def aa(d, na=None, *kasd, **kassd):
- pass
- class A(object):
- def f(self):
- return 1
- a = A()
- print '#### 各自办法描述 ####'
- print '## 函数 %s' % aa
- print '## 类办法 %s' % A.f
- print '## 实例办法 %s' % a.f
- // Py_SETREF 定义如下
- #define Py_SETREF(op, op2)
- do {
- PyObject *_py_tmp = (PyObject *)(op);
- (op) = (op2);
- Py_DECREF(_py_tmp);
- } while (0)
输出结不雅:
- #### 各自办法描述 ####
- ## 函数 <function aa at 0x000000000262AB38>
- ## 类办法 <unbound method A.f>
- ## 实例办法 <bound method A.f of <__main__.A object at 0x0000000002633198>>
method 还能再分为 Bound Method 和 Unbound Method, 他们的差别是什么呢? 差别就是Bound method 多了一个实例绑定的过程!
A.f 是 unbound method, 而 a.f 是 bound method, 大年夜而验证了膳绫擎的描述是精确的!
看到这, 我们应当会有个问题:
办法的绑定, 是什么时刻产生的? 又是如何的产生的?
带着这个问题, 我们持续商量.很明显, 办法的绑定, 肯定是伴跟着class的实例化而产生,我们都知道, 在class里定义办法, 须要显示传入self参数, 因为这个self是代表即将被实例化的对象。
我们须要dis模块来协助我们去不雅察这个绑定的过程:
咱们可以看到 第4列 和第五列, 分别就是对应: print A.f() 和 print a.f()
他们都是同样的字节码, 都是赶紧在的codeobject中的co_name掏出参数对应的名字, 正因为参数的不合, 所以它们分别取到 A 和 a,下面我们须要来看看 LOAD_ATTR 的感化是什么:
- //取自: python2.7/objects/ceval.c
- TARGET(LOAD_ATTR)
- {
- w = GETITEM(names, oparg); // 大年夜co_name 掏出 f
- v = TOP(); // 将刚才压入栈的 A/a 掏出来
- x = PyObject_GetAttr(v, w); // 取得真正的履行函数
推荐阅读
5月11日下昼,以“视”创将来为主题的首届家庭及时视频家当联盟论坛在深圳福田隆重召开。华为云核心>>>详细阅读
本文标题:Python中的函数与方法 以及Bound Method和Unbound Method
地址:http://www.17bianji.com/lsqh/35218.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示