Issue 4998: restore utility of __slots__ on Fraction.
(forward merge of r68813).
diff --git a/Lib/numbers.py b/Lib/numbers.py
index 827c253..82960f0 100644
--- a/Lib/numbers.py
+++ b/Lib/numbers.py
@@ -15,6 +15,8 @@
     If you just want to check if an argument x is a number, without
     caring what kind, use isinstance(x, Number).
     """
+    __slots__ = ()
+
     # Concrete numeric types must provide their own hash implementation
     __hash__ = None
 
@@ -38,6 +40,8 @@
     type as described below.
     """
 
+    __slots__ = ()
+
     @abstractmethod
     def __complex__(self):
         """Return a builtin complex instance. Called for complex(self)."""
@@ -152,6 +156,8 @@
     Real also provides defaults for the derived operations.
     """
 
+    __slots__ = ()
+
     @abstractmethod
     def __float__(self):
         """Any Real can be converted to a native float object.
@@ -264,6 +270,8 @@
 class Rational(Real):
     """.numerator and .denominator should be in lowest terms."""
 
+    __slots__ = ()
+
     @abstractproperty
     def numerator(self):
         raise NotImplementedError
@@ -287,6 +295,8 @@
 class Integral(Rational):
     """Integral adds a conversion to int and the bit-string operations."""
 
+    __slots__ = ()
+
     @abstractmethod
     def __int__(self):
         """int(self)"""