作家
登录

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

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

  •             PCALL(PCALL_BOUND_METHOD); 
  •             Py_INCREF(self); 
  •             func = PyMethod_GET_FUNCTION(func); 
  •             Py_INCREF(func); 
  •             Py_SETREF(*pfunc, self); 
  •             na++; 
  •             n++; 
  •         } else 
  •             Py_INCREF(func); 
  •         READ_TIMESTAMP(*pintr0); 
  •         if (PyFunction_Check(func)) 
  •             x = fast_function(func, pp_stack, n, na, nk); 
  •         else 
  •             x = do_call(func, pp_stack, na, nk); 
  •         READ_TIMESTAMP(*pintr1); 
  •         Py_DECREF(func); 
  •  
  • 咱们来捋下调用次序:

    1. CALL_FUNCTION -> call_function -> 根据函数的类型 -> 履行对应的操作 

    当法度榜样运行到call_function时, 重要有的函数类型断定有: PyCFunction, PyMethod, PyFunction

    在这里, 虚拟机已经断定出func是不属于PyCFunction, 所以将会落入膳绫擎源码的断定分支中, 而它将要做的,就是分别经由过程 PyMethod_GET_SELF, PyMethod_GET_FUNCTION 获得self对象和func函数, 然后经由过程调用 Py_SETREF(*pfunc, self):

    可以看出, Py_SETREF是用这个self对象调换了pfunc指向的对象了, 而pfunc在膳绫擎已经说起到了, 就是当时压入运行时栈的函数对象. 除了这几步, 还有更重要的就是, na 和 n 都分别自增1

    看回膳绫擎的 a.f(), 咱们可以知道, 它是不须要参数的, 所以理论上 na,nk和n都是0, 然则因为f是method(办法), 经由膳绫擎一系列操作, 它将会传入一个self,而na也会变成1, 又因为*pfunc已经被调换成self, 响应代码:

    1. if (PyFunction_Check(func)) 
    2.             x = fast_function(func, pp_stack, n, na, nk); 
    3.         else 
    4.             x = do_call(func, pp_stack, na, nk);  

    所以它不再进入function的平常路了, 而是走do_call, 然后就开端真正的调用;

    其拭魅这个涉及到Python调用函数的┞符个过程, 因为比较复杂, 后期找个时光专门谈谈这个

    聊到这里, 我们已经大年夜致清跋扈, 一个method(办法) 在调用时所产生的过程.明白了函数和办法的本质差别, 那么回到主题上 来说下 Unbound 和 Bound, 其拭魅这两者差别也不大年夜. 大年夜膳绫擎我们得知, 一个办法的创建, 是须要self, 而调用时, 也会应用self,而只有实例化对象, 才有这个self, class是没有的, 所以像下面的履行, 是掉败的额

    1. class A(object): 
    2.     def f(self): 
    3.         return 1 
    4. a = A() 
    5.   
    6. print '#### 各自办法等效调用 ####' 
    7. print '## 类办法 %s' % A.f() 
    8. print '## 实例办法 %s' % a.f() 
    9.   
    10. ## 输出结不雅 ## 

        推荐阅读

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

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


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

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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