Issue #16049: add abc.ABC helper class.

Patch by Bruno Dupuis.
This commit is contained in:
Andrew Svetlov 2012-12-13 19:09:33 +02:00
parent 174bc1e309
commit b67596d815
4 changed files with 36 additions and 4 deletions

View 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

View 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

View 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

View File

@ -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.