]> granicus.if.org Git - python/commitdiff
Issue #16049: add abc.ABC helper class.
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Thu, 13 Dec 2012 17:09:33 +0000 (19:09 +0200)
committerAndrew Svetlov <andrew.svetlov@gmail.com>
Thu, 13 Dec 2012 17:09:33 +0000 (19:09 +0200)
Patch by Bruno Dupuis.

Doc/library/abc.rst
Lib/abc.py
Lib/test/test_abc.py
Misc/NEWS

index 6f235962c9e11804f2537e533ea87451b12df6a6..75eaa3024164a7df2d20b6c32114f84ec1c76fb3 100644 (file)
@@ -12,9 +12,9 @@
 --------------
 
 This module provides the infrastructure for defining :term:`abstract base
-classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this
-was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
-regarding a type hierarchy for numbers based on ABCs.)
+classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`;
+see the PEP for why this was added to Python. (See also :pep:`3141` and the
+:mod:`numbers` module regarding a type hierarchy for numbers based on ABCs.)
 
 The :mod:`collections` module has some concrete classes that derive from
 ABCs; these can, of course, be further derived. In addition the
@@ -23,7 +23,7 @@ a class or instance provides a particular interface, for example, is it
 hashable or a mapping.
 
 
-This module provides the following class:
+This module provides the following classes:
 
 .. class:: ABCMeta
 
@@ -127,6 +127,16 @@ This module provides the following class:
    available as a method of ``Foo``, so it is provided separately.
 
 
+.. class:: ABC
+
+   A helper class that has :class:`ABCMeta` as metaclass. :class:`ABC` is the
+   standard class to inherit from in order to create an abstract base class,
+   avoiding sometimes confusing metaclass usage.
+
+   Note that :class:`ABC` type is still :class:`ABCMeta`, therefore inheriting
+   from :class:`ABC` requires usual precautions regarding metaclasses usage
+   as multiple inheritance may lead to metaclass conflicts.
+
 The :mod:`abc` module also provides the following decorators:
 
 .. decorator:: abstractmethod
index 09778e8609f73aa8390ba9bc620dcbe138c1199e..e807895da3e3f3f96277db185c9220010e18ff69 100644 (file)
@@ -226,3 +226,9 @@ class ABCMeta(type):
         # No dice; update negative cache
         cls._abc_negative_cache.add(subclass)
         return False
+
+class ABC(metaclass=ABCMeta):
+    """Helper class that provides a standard way to create an ABC using
+    inheritance.
+    """
+    pass
index 653c957b814ac247063942499aadc16beca34665..349852450189ae8b906215117ae80cd8a446ecef 100644 (file)
@@ -96,6 +96,19 @@ class TestLegacyAPI(unittest.TestCase):
 
 class TestABC(unittest.TestCase):
 
+    def test_ABC_helper(self):
+        # create an ABC using the helper class and perform basic checks
+        class C(abc.ABC):
+            @classmethod
+            @abc.abstractmethod
+            def foo(cls): return cls.__name__
+        self.assertEqual(type(C), abc.ABCMeta)
+        self.assertRaises(TypeError, C)
+        class D(C):
+            @classmethod
+            def foo(cls): return super().foo()
+        self.assertEqual(D.foo(), 'D')
+
     def test_abstractmethod_basics(self):
         @abc.abstractmethod
         def foo(self): pass
index c149ddf4b4a0b875928bebd2998bd81177394bcb..91fc7c096419c3e60921db709b9f2c18964e8117 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -163,6 +163,9 @@ Core and Builtins
 Library
 -------
 
+- Add abc.ABC class to use inheritance rather than a direct invocation of
+  ABCMeta metaclass. Patch by Bruno Dupuis.
+
 - Expose the TCP_FASTOPEN and MSG_FASTOPEN flags in socket when they're
   available.