Python 通过Class.method(instance)和instance.method()调用方法之间的区别

Python 通过Class.method(instance)和instance.method()调用方法之间的区别,python,methods,Python,Methods,在各种教程中,我看到它声称使用instance.method()调用方法在语法上等同于Class.method(instance)。我还研究了什么是“方法绑定”,python官方文档指出: “当引用的实例属性不是数据属性时, 将搜索其类。如果名称表示有效的类属性 这是一个函数对象,一个方法对象是通过打包创建的 (指向)刚刚找到的实例对象和函数对象 合并在一个抽象对象中:这是方法对象 使用参数列表调用方法对象时,将创建新的参数列表 由实例对象和参数列表以及 使用此新参数列表调用函数对象。“ 基于此

在各种教程中,我看到它声称使用
instance.method()
调用方法在语法上等同于
Class.method(instance)
。我还研究了什么是“方法绑定”,python官方文档指出:

“当引用的实例属性不是数据属性时, 将搜索其类。如果名称表示有效的类属性 这是一个函数对象,一个方法对象是通过打包创建的 (指向)刚刚找到的实例对象和函数对象 合并在一个抽象对象中:这是方法对象 使用参数列表调用方法对象时,将创建新的参数列表 由实例对象和参数列表以及 使用此新参数列表调用函数对象。“


基于此描述,似乎只有
instance.method()
语法会导致创建“抽象方法对象”,因为“引用了实例属性”。如果是这样的话,这两个表达式在语法上是如何等价的?

因为创建抽象对象只是一个中间步骤。在您给出的报价中,最终结果是:

从实例对象和参数列表构造新的参数列表,并使用此新参数列表调用函数对象


换句话说,最后,调用“是”该方法的函数对象时,实例作为第一个参数,其余参数传递。这也是当你自己用实例作为第一个参数调用方法时会发生的情况。

Hmm我想我现在明白了。使用Class.method(instance)在技术上是否“更快”,因为它跳过了创建抽象对象和生成新参数列表的中间步骤?@user2154633:可能,但您为什么关心这些呢?确切地说,它们在语法上并不等价,因为它们具有不同的语法。但是他们有相同的结果。在这两个步骤之间,
instance.method()
调用
class.method(instance)
。最后,这只是“语法”的一个错误用法。