为什么__sub__和__rsub__实现了,以这种方式,对于numbers.Complex

use*_*416 0 python numbers class abstract-base-class

我一直在寻找的实施Complexnumbers模块,发现__sub____rsub__看起来像这样的实现:

def __sub__(self, other):
    """ self - other """
    return self + -other

def __rsub__(self, other):
    """ other - self """
    return -self + other
Run Code Online (Sandbox Code Playgroud)

这困惑了我.

首先,我不确定为什么要实现这些(猜测所有子类都Complex可以回退它?),其次,我无法理解为什么他们选择使用这样的一元-来实现它.

有任何想法吗?

Mar*_*ers 5

这是子类可以使用的通用实现,是的,如果他们愿意的话.这是一个额外的目标; 这些ABC类型的主要目标是能够使用类型数字类型(参见PEP 3141 - 数字类型层次结构).

该实现使用一元减号来避免递归; 如果您使用过self - otherPython使用self.__sub__(other)self.__rsub__(other) 再次使用.

因为减法可以作为加法使用一元减法操作,ABC的作者能够为您提供这些方法作为奖励; 另一种@abstracmethod方法是提供方法,强制子类提供具体的实现.你的子类,现在,可选,实现以不同的方式这些方法,如果这是更有效的,但他们不具备对.

这是标准库提供的所有ABC中使用的模式.如果您查看模块文档,collections.abc您会注意到Mixin Methods列; 这些是各个ABC提供的所有方法作为具体实现,可能依赖或不依赖于ABC或其基类定义的抽象方法.

另请参阅通用PEP 3119 - 介绍构建PEP 3141的抽象基类:

一些ABC也提供具体的(即非抽象的)方法; 例如,Iterator该类有一个__iter__返回自身的方法,实现迭代器的一个重要的不变量(在Python 2中必须由每个迭代器类重新实现).这些ABC可以被认为是"混合"类.