作家
登录

Python中的函数与方法 以及Bound Method和Unbound Method

作者: 来源: 2017-05-15 15:07:28 阅读 我要评论

 (PyObject *)im; 

所以本质上, 函数和办法的差别是: 函数是属于 FunctionObject, 而 办法是属 PyMethodObject

简单来看下代码:

  1. def aa(d, na=None, *kasd, **kassd): 
  2.     pass 
  3. class A(object): 
  4.     def f(self): 
  5.         return 1 
  6. a = A() 
  7. print '#### 各自办法描述 ####' 
  8. print '## 函数     %s' % aa 
  9. print '## 类办法   %s' % A.f 
  10. print '## 实例办法 %s' % a.f  
  1. // Py_SETREF 定义如下 
  2. #define Py_SETREF(op, op2)                       
  3.     do {                                         
  4.         PyObject *_py_tmp = (PyObject *)(op);   
  5.         (op) = (op2);                           
  6.         Py_DECREF(_py_tmp);                     
  7.     } while (0)  

输出结不雅:

  1. #### 各自办法描述 #### 
  2. ## 函数   <function aa at 0x000000000262AB38> 
  3. ## 类办法   <unbound method A.f> 
  4. ## 实例办法 <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 的感化是什么:

  1. //取自: python2.7/objects/ceval.c 
  2.         TARGET(LOAD_ATTR) 
  3.         { 
  4.             w = GETITEM(names, oparg);  // 大年夜co_name 掏出 f 
  5.             v = TOP();                  // 将刚才压入栈的 A/a 掏出来 
  6.             x = PyObject_GetAttr(v, w); // 取得真正的履行函数 

      推荐阅读

      “视”创未来,首届家庭实时视频产业联盟论坛呼吁共建产业生态

    5月11日下昼,以“视”创将来为主题的首届家庭及时视频家当联盟论坛在深圳福田隆重召开。华为云核心>>>详细阅读


    本文标题:Python中的函数与方法 以及Bound Method和Unbound Method

    地址:http://www.17bianji.com/lsqh/35218.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)