]> granicus.if.org Git - python/commitdiff
Roll back r60248. It's useful to encourage users not to change Rational
authorJeffrey Yasskin <jyasskin@gmail.com>
Fri, 1 Feb 2008 07:05:46 +0000 (07:05 +0000)
committerJeffrey Yasskin <jyasskin@gmail.com>
Fri, 1 Feb 2008 07:05:46 +0000 (07:05 +0000)
instances.

Lib/rational.py
Lib/test/test_rational.py

index 2222045add34fddbe1aa89d83deebd713d01b75e..bc2259bb5436337d5f6a71d71d02b65c545717fe 100755 (executable)
@@ -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))
index 3c3d1f96fe3837b538490cb1a5ffcd70122948aa..1c378742a560258ba958e2cf4bb819e74f4bb6bf 100644 (file)
@@ -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)",