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

时间:2016-11-08 14:57:20

标签: python class numbers abstract-base-class

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

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

def __rsub__(self, other):
    """ other - self """
    return -self + other
这让我很困惑。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

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

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

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

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

另请参阅构建PEP 3141的一般PEP 3119 – Introducing Abstract Base Classes

  

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