
Numbers
When creating new numbers (or extending existing numbers), we'll turn to the numbers
module. This module contains the abstract definitions of Python's built-in numeric types. These types form a tall, narrow hierarchy, from the simplest to the most elaborate. In this case, simplicity (and elaboration) refers to the collection of methods available.
There's an abstract base class named numbers.Number
that defines all of the numeric and number-like classes. We can see that this is true with interactions like the following one:
>>> import numbers >>> isinstance( 42, numbers.Number ) True >>> 355/113 3.1415929203539825 >>> isinstance( 355/113, numbers.Number ) True
Clearly, integer and float values are subclasses of the abstract numbers.Number
class.
The subclasses include numbers.Complex
, numbers.Real
, numbers.Rational
, and numbers.Integral
. These definitions are roughly parallel mathematical thoughts on the various classes of numbers.
The decimal.Decimal
class, however, doesn't fit this hierarchy extremely well. We can check the relationships using the issubclass()
method as follows:
>>> issubclass( decimal.Decimal, numbers.Number ) True >>> issubclass( decimal.Decimal, numbers.Integral ) False >>> issubclass( decimal.Decimal, numbers.Real ) False >>> issubclass( decimal.Decimal, numbers.Complex ) False >>> issubclass( decimal.Decimal, numbers.Rational ) False
It shouldn't be too surprising that Decimal
doesn't fit the established number types well. For a concrete implementation of numbers.Rational
, look at the fractions
module. We'll look at the various kinds of numbers in detail in Chapter 7, Creating Numbers.