1

在 python 中,多态性是如何工作的?

在python中,如果我有一些功能,例如

def f(x):
    return x + 2*x + 3*x + 4*x + 5*x + 6*x

然后根据dis.dis(f)python将其转换为描述以下循环的字节码指令:

  • 加载下一个常量值
  • x再次加载
  • 将它们相乘
  • 添加产品(在前面的项的累积上)

但是如果x是一个numpy数组或python类,而不是一个基本的数据类型,那么可能解释器必须做额外的工作(例如二进制乘法操作码必须以某种方式引导其他函数被调用,也许从一些属性查找开始,这通常对应于完全不同的操作码)。这似乎与普通汇编语言非常不同,在普通汇编语言中,简单的算术运算将是原子的(并且不会导致 CPU 也执行反汇编列表中不可见的额外指令)。

是否有关于 python 解释器如何操作的文档,以及在评估涉及多态性的表达式时它实际执行的步骤序列?(理想情况下,在一个较低的细节层次上,一个步进式 python 调试器会暴露什么?)

编辑:

为了支持多态性,算术运算还必须不仅涉及算术,还必须涉及类型检查、属性查找、条件跳转和函数调用。(所有这些东西都有自己的操作码。)cpython通过使算术操作码本身在解释器的一个步骤中执行许多复杂的操作来实现这一点是否正确(被调用函数中包含的指令除外),而不是通过一系列单独的操作码单步执行解释器来实现相同的结果(例如,LOAD_ATTR、CALL_FUNCTION 等)?

是否有任何文档,例如表格,用于所有操作码,描述每个操作码可能导致的所有操作?

4

1 回答 1

0

您可以通过实现相应的魔术方法来定义运算符对自定义类的行为方式:

 >>> class MyClass(object):
...     def __add__(self, x):
...         return '%s plus %s' % (self, x)
...     def __mul__(self, x):
...         return "%s mul %s" % (self, x)

我认为这就是幕后工作array的方式numpy

您可以跟踪*以获取有关numpy 的实现的更多信息array

于 2017-07-19T02:48:55.300 回答