10.3 Defining classes with total ordering
The @total_ordering
decorator is helpful for creating new class definitions that implement a rich set of comparison operators. This might apply to numeric classes that subclass numbers.Number
. It may also apply to semi-numeric classes.
As an example of a semi-numeric class, consider a playing card. It has a numeric rank and a symbolic suit. The suit, for example, may not matter for some games. Like ordinary integers, cards have an ordering. We often sum the point values of each card, making them number-like. However, multiplication of cards, card × card, doesn’t really make any sense; a card isn’t quite like a number.
We can almost emulate a playing card with a NamedTuple
base class as follows:
from typing import NamedTuple
class Card1(NamedTuple):
rank: int
suit: str
This model suffers from a profound limitation: all comparisons between cards will include...