【问题标题】:Difference between calling a method via Class.method(instance) and instance.method()通过 Class.method(instance) 和 instance.method() 调用方法的区别
【发布时间】:2016-01-25 05:33:36
【问题描述】:

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

"当引用的实例属性不是数据属性时, 它的类被搜索。如果名称表示有效的类属性 也就是函数对象,方法对象是通过打包创建的 (指向)实例对象和刚刚找到的函数对象 一起在一个抽象对象中:这是方法对象。当。。。的时候 使用参数列表调用方法对象,新的参数列表是 由实例对象和参数列表构造而成,并且 使用这个新的参数列表调用函数对象。”

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

【问题讨论】:

  • 确切地说,它们在语法上并不等价,因为它们具有不同的语法。但他们有相同的结果。中间有一些步骤,instance.method() 调用class.method(instance)。最后,这只是“语法”的错误用法。

标签: python methods


【解决方案1】:

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

从实例对象和参数列表构造一个新的参数列表,并用这个新的参数列表调用函数对象

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

【讨论】:

  • 嗯,我想我现在明白了。那么使用 Class.method(instance) 在技术上是否“更快”,因为它跳过了创建抽象对象和生成新参数列表的中间步骤?
  • @user2154633:可能,但你为什么要关心这些?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多