diff options
author | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-02-01 07:05:46 (GMT) |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@gmail.com> | 2008-02-01 07:05:46 (GMT) |
commit | dc2964b0d849389bffde95b8f76fd112049e114f (patch) | |
tree | 6b6db21fcc4dbee5a7ea9f87973ea2b694742005 /Lib | |
parent | ca2b69f765dd8a7f5c8e5c5346572519a8768ec4 (diff) | |
download | cpython-dc2964b0d849389bffde95b8f76fd112049e114f.zip cpython-dc2964b0d849389bffde95b8f76fd112049e114f.tar.gz cpython-dc2964b0d849389bffde95b8f76fd112049e114f.tar.bz2 |
Roll back r60248. It's useful to encourage users not to change Rational
instances.
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/rational.py | 14 | ||||
-rw-r--r-- | Lib/test/test_rational.py | 11 |
2 files changed, 22 insertions, 3 deletions
diff --git a/Lib/rational.py b/Lib/rational.py index 2222045..bc2259b 100755 --- a/Lib/rational.py +++ b/Lib/rational.py @@ -43,7 +43,7 @@ class Rational(RationalAbc): """ - __slots__ = ('numerator', 'denominator') + __slots__ = ('_numerator', '_denominator') # We're immutable, so use __new__ not __init__ def __new__(cls, numerator=0, denominator=1): @@ -93,8 +93,8 @@ class Rational(RationalAbc): raise ZeroDivisionError('Rational(%s, 0)' % numerator) g = gcd(numerator, denominator) - self.numerator = int(numerator // g) - self.denominator = int(denominator // g) + self._numerator = int(numerator // g) + self._denominator = int(denominator // g) return self @classmethod @@ -168,6 +168,14 @@ class Rational(RationalAbc): result = new return result + @property + def numerator(a): + return a._numerator + + @property + def denominator(a): + return a._denominator + def __repr__(self): """repr(self)""" return ('Rational(%r,%r)' % (self.numerator, self.denominator)) diff --git a/Lib/test/test_rational.py b/Lib/test/test_rational.py index 3c3d1f9..1c37874 100644 --- a/Lib/test/test_rational.py +++ b/Lib/test/test_rational.py @@ -119,6 +119,17 @@ class RationalTest(unittest.TestCase): r.__init__(2, 15) self.assertEquals((7, 3), _components(r)) + self.assertRaises(AttributeError, setattr, r, 'numerator', 12) + self.assertRaises(AttributeError, setattr, r, 'denominator', 6) + self.assertEquals((7, 3), _components(r)) + + # But if you _really_ need to: + r._numerator = 4 + r._denominator = 2 + self.assertEquals((4, 2), _components(r)) + # Which breaks some important operations: + self.assertNotEquals(R(4, 2), r) + def testFromFloat(self): self.assertRaisesMessage( TypeError, "Rational.from_float() only takes floats, not 3 (int)", |