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)
。最后,这只是“语法”的一个错误用法。