0

我正在查看模块中的实现,Complexnumbers注意到__sub____rsub__的实现看起来像这样:

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

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

这让我很困惑。

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

有任何想法吗?

4

1 回答 1

5

这是子类可以使用的通用实现,是的,如果他们愿意的话。这是一个额外的目标;这些 ABC 类型的主要目标是能够对数字类型进行回避(参见PEP 3141 – A Type Hierarchy for Numbers

该实现使用一元减号来避免递归;如果你使用过,self - other那么 Python会再次使用.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 可以被认为是“混合”类。

于 2016-11-08T14:59:21.080 回答