From b67596d8157ef972d418e623a99c8462f485c4d6 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Thu, 13 Dec 2012 19:09:33 +0200 Subject: [PATCH] Issue #16049: add abc.ABC helper class. Patch by Bruno Dupuis. --- Doc/library/abc.rst | 18 ++++++++++++++---- Lib/abc.py | 6 ++++++ Lib/test/test_abc.py | 13 +++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 6f235962c9e..75eaa302416 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -12,9 +12,9 @@ -------------- This module provides the infrastructure for defining :term:`abstract base -classes ` (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 ` (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 diff --git a/Lib/abc.py b/Lib/abc.py index 09778e8609f..e807895da3e 100644 --- a/Lib/abc.py +++ b/Lib/abc.py @@ -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 diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 653c957b814..34985245018 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index c149ddf4b4a..91fc7c09641 100644 --- 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.