Python 中函数、未绑定方法和绑定方法之间有什么区别?

Susan Sarandon
发布: 2024-10-26 07:03:30
原创
282 人浏览过

  What's the Difference Between Functions, Unbound Methods, and Bound Methods in Python?

揭示函数、未绑定方法和绑定方法之间的差异

考虑以下代码片段:

<code class="python">class A(object):
    def f1(self): pass
a = A()</code>
登录后复制

变量 f1 可以以三种不同的形式表现出来:

  • 绑定方法: a.f1 提供对与实例 a 关联的方法的访问。
  • Unbound Method: A.f1 对应类 A 所附加的方法。
  • Function: a.__dict__['f1'] 直接获取底层函数定义.

对象区别

由 def 关键字或 lambda 定义的函数,在放置在类语句中时会经历转换。在 Python 2 中,此转换创建了一个未绑定方法,这是 Python 3 中不存在的概念。在类的实例上访问此方法会进一步将其转换为绑定方法,该方法将实例无缝绑定为初始参数 (self)。

示例:

<code class="python">def f1(self):
    pass</code>
登录后复制

这里,f1 是一个函数。相比之下,C.f1 是未绑定方法:

<code class="python">class C(object):
    f1 = f1</code>
登录后复制

方法调用和转换

可以通过在实例上访问未绑定方法将其转换为绑定方法其类类型:

<code class="python">C().f1</code>
登录后复制

或使用描述符协议:

<code class="python">C.f1.__get__(C(), C)</code>
登录后复制

函数可以手动转换为未绑定方法:

<code class="python">import types
types.MethodType(f1, None, C)</code>
登录后复制

结合这些技术允许直接创建绑定方法:

<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
登录后复制

函数和未绑定方法之间的关键区别在于后者对其类绑定的感知。因此,调用或绑定未绑定方法需要其附属类类型的实例。

在 Python 3 中,消除了函数和未绑定方法之间的区别。相反,访问类实例上的函数直接返回函数本身:

<code class="python">C.f1 is f1</code>
登录后复制

方法等效性

总之,以下调用在 Python 2 中是等效的和 Python 3:

<code class="python">f1(C())
C.f1(C())
C().f1()</code>
登录后复制

将函数绑定到实例可以有效地将其初始参数固定到实例,使绑定方法类似于以下 lambda 表达式:

<code class="python">lambda *args, **kwargs: f1(C(), *args, **kwargs)</code>
登录后复制

以上是Python 中函数、未绑定方法和绑定方法之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!