我正在查看Complex
模块中numbers
的实现,并注意到__sub__
和__rsub__
的实现看起来像这样:
def __sub__(self, other):
""" self - other """
return self + -other
def __rsub__(self, other):
""" other - self """
return -self + other
这让我很困惑。
首先,我不确定为什么要实现这些(猜测Complex
的所有子类都可以回退它?),其次,我无法理解为什么他们选择使用一元{ {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可以被视为“混合”类。