当前位置: 首页 > 面试题库 >

函数,未绑定方法和绑定方法有什么区别?

戚哲
2023-03-14
问题内容

我之所以问这个问题,是因为对该答案的评论主题进行了讨论。我有90%的方法可以解决问题。

In [1]: class A(object):  # class named 'A'
   ...:     def f1(self): pass
   ...:
In [2]: a = A()  # an instance

f1 存在三种不同形式:

In [3]: a.f1  # a bound method
Out[3]: <bound method a.f1 of <__main__.A object at 0x039BE870>>
In [4]: A.f1  # an unbound method
Out[4]: <unbound method A.f1>
In [5]: a.__dict__['f1']  # doesn't exist
KeyError: 'f1'
In [6]: A.__dict__['f1']  # a function
Out[6]: <function __main__.f1>

绑定方法未绑定方法函数
对象之间的区别是什么,所有这些都由f1描述?一个人怎么称呼这三个物体?它们如何相互转化?关于这些东西的文档很难理解。


问题答案:

一个 功能 是创建由def声明,或通过lambda。在Python
2下,当函数出现在class语句主体中(或传递给type类构造调用)时,它将转换为 未绑定方法 。(Python3没有未绑定的方法;请参见下文。)在类实例上访问函数时,它将转换为 绑定方法 ,该 方法 自动将实例作为第一个self参数提供给该方法。

def f1(self):
    pass

f1是一个 功能

class C(object):
    f1 = f1

现在C.f1是一种未绑定的方法。

>>> C.f1
<unbound method C.f1>
>>> C.f1.im_func is f1
True

我们还可以使用type类构造函数:

>>> C2 = type('C2', (object,), {'f1': f1})
>>> C2.f1
<unbound method C2.f1>

我们可以f1手动转换为未绑定方法:

>>> import types
>>> types.MethodType(f1, None, C)
<unbound method C.f1>

未绑定方法受类实例上访问的约束:

>>> C().f1
<bound method C.f1 of <__main__.C object at 0x2abeecf87250>>

通过描述符协议将访问转换为调用:

>>> C.f1.__get__(C(), C)
<bound method C.f1 of <__main__.C object at 0x2abeecf871d0>>

结合这些:

>>> types.MethodType(f1, None, C).__get__(C(), C)
<bound method C.f1 of <__main__.C object at 0x2abeecf87310>>

或直接:

>>> types.MethodType(f1, C(), C)                
<bound method C.f1 of <__main__.C object at 0x2abeecf871d0>>

函数和未绑定方法之间的主要区别在于,后者知道绑定到哪个类。调用或绑定未绑定方法需要其类类型的实例:

>>> f1(None)
>>> C.f1(None)
TypeError: unbound method f1() must be called with C instance as first argument (got NoneType instance instead)
>>> class D(object): pass
>>> f1.__get__(D(), D)
<bound method D.f1 of <__main__.D object at 0x7f6c98cfe290>>
>>> C.f1.__get__(D(), D)
<unbound method C.f1>

由于函数和未绑定方法之间的差异很小,因此Python 3摆脱了这种区别;在Python 3下访问类实例上的函数只会为您提供函数本身:

>>> C.f1
<function f1 at 0x7fdd06c4cd40>
>>> C.f1 is f1
True

那么,在Python 2和Python 3中,这三个是等效的:

f1(C())
C.f1(C())
C().f1()

将函数绑定到实例具有将其第一个参数(通常称为self)固定到实例的效果。因此,绑定方法C().f1等效于以下任何一个:

(lamdba *args, **kwargs: f1(C(), *args, **kwargs))
functools.partial(f1, C())


 类似资料:
  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • 本文向大家介绍详解python方法之绑定方法与非绑定方法,包括了详解python方法之绑定方法与非绑定方法的使用技巧和注意事项,需要的朋友参考一下 写在之前 在 Python 的类里面除了属性之外,还有方法,当然也有文档和注释这类东西,但是这个只是人来看,计算机则不关心。我们之前说过,我们一般用实例调用方法,既然我们说了是一般,那么就说明还有其他调用方法的方式,今天我们就来说一下「绑定方法和非绑定

  • 问题内容: 有人可以在OOP上下文中提供方法与功能的简单说明吗? 问题答案: 甲函数是一段代码由名字叫做。可以传递数据以对其进行操作(即参数),还可以选择返回数据(返回值)。传递给函数的所有数据都被显式传递。 甲方法是一段代码,由与对象相关联的名称叫。在大多数方面,它与功能相同,但有两个主要区别: 方法被隐式传递给调用该方法的对象。 方法能够对类中包含的数据进行操作(记住,对象是类的实例-类是定义

  • 问题内容: 以下类方法有什么区别? 是一个是静态的,另一个不是静态的吗? 问题答案: 在Python,有区别绑定和未绑定的方法。 基本上,是调用成员函数(如),绑定函数 被翻译成 即对未绑定方法的调用。因此,呼叫你的版本method_two将失败,并显示TypeError 你可以使用装饰器更改方法的行为 装饰器告诉内置默认元类type(一个类的类,请参见此问题)不为创建绑定方法method_two

  • 我需要帮助解决这个问题; 我知道call()方法将引用没有属性命名的人对象。 有没有办法使用bind()call()或apply()方法打印“Louie是Benjamin的狗”

  • 本文向大家介绍Python中绑定与未绑定的类方法用法分析,包括了Python中绑定与未绑定的类方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下: 像函数一样,Python中的类方法也是一种对象。由于既可以通过实例也可以通过类来访问方法,所以在Python里有两种风格: 未绑定的类方法:没有self 通过类来引用方