方法对象vs函数对象,Python类实例vs类

方法对象vs函数对象,Python类实例vs类,第1张

方法对象vs函数对象,Python类实例vs类 绑定未绑定 方法-一种解释。…或者为什么Python具有您指出的行为。

因此,首先请注意,这在3.x中是不同的。在3.x中,您将像预期的那样成为

MyClass.f
函数和
x.f
方法。这种行为本质上是一个糟糕的设计决策,后来又被更改。

原因是Python具有与大多数语言不同的方法的概念,该方法本质上是一个函数,其中第一个参数被预先填充为实例(

self
)。这种预填充构成 绑定方法

>>> x.foo<bound method MyClass.foo of <__main__.MyClass instance at 0x1004989e0>>

在Python 2.x和更早版本中,有理由认为未附加到实例的 方法 将是 未绑定方法 ,该 方法
是一个函数,其限制是第一个参数(

self
)必须是对象的实例。然后可以将其绑定到实例并成为 绑定方法

>>> MyClass.foo<unbound method MyClass.foo>

随着时间的流逝,很明显的是,一个未绑定的方法实际上只是具有这个无关紧要的限制的函数,实际上并不重要(

self
必须是 “正确”
类型),因此将它们从语言中删除(在3.x版中)。这本质上是鸭式打字
self
,适合语言。

Python 3.3.0 (default, Dec  4 2012, 00:30:24) >>> x.foo<bound method MyClass.foo of <__main__.MyClass object at 0x100858ed0>>>>> MyClass.foo<function MyClass.foo at 0x10084f9e0>
进一步阅读。

这是(从内存中压缩的)解释,可以从Python创造者Guido van Rossum自己的“ Python的历史”系列中完整地阅读。



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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存