Mastering Objectoriented Python
上QQ阅读APP看书,第一时间看更新

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.