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

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

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

一个 功能 是创建由

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 f1True

我们还可以使用

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 f1True

那么,在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())


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5654780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存