Index: Doc/library/collections.rst =================================================================== --- Doc/library/collections.rst (revision 68803) +++ Doc/library/collections.rst (working copy) @@ -300,6 +300,7 @@ * `Bag class `_ in Smalltalk + * `C++ multisets `_ tutorial with standalone examples Index: Lib/numbers.py =================================================================== --- Lib/numbers.py (revision 68802) +++ Lib/numbers.py (working copy) @@ -17,6 +17,7 @@ caring what kind, use isinstance(x, Number). """ __metaclass__ = ABCMeta + __slots__ = () # Concrete numeric types must provide their own hash implementation __hash__ = None @@ -41,6 +42,8 @@ type as described below. """ + __slots__ = () + @abstractmethod def __complex__(self): """Return a builtin complex instance. Called for complex(self).""" @@ -172,6 +175,8 @@ Real also provides defaults for the derived operations. """ + __slots__ = () + @abstractmethod def __float__(self): """Any Real can be converted to a native float object. @@ -265,6 +270,8 @@ class Rational(Real): """.numerator and .denominator should be in lowest terms.""" + __slots__ = () + @abstractproperty def numerator(self): raise NotImplementedError @@ -288,6 +295,8 @@ class Integral(Rational): """Integral adds a conversion to long and the bit-string operations.""" + __slots__ = () + @abstractmethod def __long__(self): """long(self)""" Index: Lib/test/test_fractions.py =================================================================== --- Lib/test/test_fractions.py (revision 68802) +++ Lib/test/test_fractions.py (working copy) @@ -394,6 +394,11 @@ self.assertEqual(id(r), id(copy(r))) self.assertEqual(id(r), id(deepcopy(r))) + def test_slots(self): + # Issue 4998 + r = F(13, 7) + self.assertRaises(AttributeError, setattr, r, 'a', 10) + def test_main(): run_unittest(FractionTest, GcdTest)