]> granicus.if.org Git - python/commitdiff
Add subclassing example to docs for named tuples.
authorRaymond Hettinger <python@rcn.com>
Mon, 7 Jan 2008 04:24:49 +0000 (04:24 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 7 Jan 2008 04:24:49 +0000 (04:24 +0000)
Doc/library/collections.rst
Lib/collections.py

index 0205cf1aa8c0fd11b2455d38ecc8690fa994bfee..1f9e82dc7023926a969c49052b901d0121836522 100644 (file)
@@ -510,15 +510,22 @@ When casting a dictionary to a named tuple, use the double-star-operator [#]_::
    Point(x=11, y=22)
 
 Since a named tuple is a regular Python class, it is easy to add or change
-functionality.  For example, the display format can be changed by overriding
-the :meth:`__repr__` method:
+functionality with a subclass.  Here is how to add a calculated field and
+a custom fixed-width print format:
 
 ::
 
-    >>> Point = namedtuple('Point', 'x y')
-    >>> Point.__repr__ = lambda self: 'Point(%.3f, %.3f)' % self
-    >>> Point(x=11, y=22)
-    Point(11.000, 22.000)
+    >>> class Point(namedtuple('Point', 'x y')):
+        @property
+        def hypot(self):
+            return (self.x ** 2 + self.y ** 2) ** 0.5
+        def __repr__(self):
+            return 'Point(x=%.3f, y=%.3f, hypot=%.3f)' % (self.x, self.y, self.hypot)
+
+    >>> print Point(3, 4)
+    Point(x=3.000, y=4.000, hypot=5.000)
+    >>> Point(2, 5)
+    Point(x=2.000, y=5.000, hypot=5.385)
 
 Default values can be implemented by starting with a prototype instance
 and customizing it with :meth:`_replace`:
index 0b8689850270d35f734d14e89fa420252ba42e6f..1701952cde7c22dc97696c83785f5f3f1e75d9e4 100644 (file)
@@ -116,8 +116,15 @@ if __name__ == '__main__':
     assert p == loads(dumps(p))
 
     # test and demonstrate ability to override methods
-    Point.__repr__ = lambda self:  'Point(%.3f, %.3f)' % self
-    print p
+    class Point(namedtuple('Point', 'x y')):
+        @property
+        def hypot(self):
+            return (self.x ** 2 + self.y ** 2) ** 0.5
+        def __repr__(self):
+            return 'Point(x=%.3f, y=%.3f, hypot=%.3f)' % (self.x, self.y, self.hypot)
+
+    print Point(3, 4)
+    print Point(2, 5)
 
     import doctest
     TestResults = namedtuple('TestResults', 'failed attempted')