]> granicus.if.org Git - python/commitdiff
bpo-33437: add __new__ vs __init__ example (GH-9145)
authorEthan Furman <ethan@stoneleaf.us>
Wed, 12 Sep 2018 17:00:30 +0000 (10:00 -0700)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 12 Sep 2018 17:00:30 +0000 (10:00 -0700)
Improve Enum docs.

https://bugs.python.org/issue33437

Doc/library/enum.rst
Misc/ACKS

index 3f17f99476415bd76d9ac7f709cdad3576bdbf1d..6408c01060406bf5f7c6fa706f02fc3aeabb1978 100644 (file)
@@ -736,6 +736,37 @@ Some rules:
    type's :meth:`__format__`.  If the :class:`Enum` class's :func:`str` or
    :func:`repr` is desired, use the `!s` or `!r` format codes.
 
+When to use :meth:`__new__` vs. :meth:`__init__`
+------------------------------------------------
+
+:meth:`__new__` must be used whenever you want to customize the actual value of
+the :class:`Enum` member.  Any other modifications may go in either
+:meth:`__new__` or :meth:`__init__`, with :meth:`__init__` being preferred.
+
+For example, if you want to pass several items to the constructor, but only
+want one of them to be the value::
+
+    >>> class Coordinate(bytes, Enum):
+    ...     """
+    ...     Coordinate with binary codes that can be indexed by the int code.
+    ...     """
+    ...     def __new__(cls, value, label, unit):
+    ...         obj = bytes.__new__(cls, [value])
+    ...         obj._value_ = value
+    ...         obj.label = label
+    ...         obj.unit = unit
+    ...         return obj
+    ...     PX = (0, 'P.X', 'km')
+    ...     PY = (1, 'P.Y', 'km')
+    ...     VX = (2, 'V.X', 'km/s')
+    ...     VY = (3, 'V.Y', 'km/s')
+    ...
+
+    >>> print(Coordinate['PY'])
+    Coordinate.PY
+
+    >>> print(Coordinate(3))
+    Coordinate.VY
 
 Interesting examples
 --------------------
index 75047d89010e3742d42275ddc23cbaedc853bfb5..0d9431d24290e6c026e22d8ba34fafd5c5bfe190 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -68,6 +68,7 @@ Ammar Askar
 Neil Aspinall
 Chris AtLee
 Aymeric Augustin
+Andres Ayala
 Cathy Avery
 John Aycock
 Donovan Baarda