大佬教程收集整理的这篇文章主要介绍了函数,未绑定方法和绑定方法有什么区别?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一个 功能 是创建由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())
我之所以问这个问题,是因为对该答案的评论主题进行了讨论。我有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描述?一个人怎么称呼这三个物体?它们如何相互转化?关于这些东西的文档很难理解。
以上是大佬教程为你收集整理的函数,未绑定方法和绑定方法有什么区别?全部内容,希望文章能够帮你解决函数,未绑定方法和绑定方法有什么区别?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。