因此,首先请注意,这在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的历史”系列中完整地阅读。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)