2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
:mod:`abc` --- Abstract Base Classes
|
|
|
|
====================================
|
|
|
|
|
|
|
|
.. module:: abc
|
|
|
|
:synopsis: Abstract base classes according to PEP 3119.
|
|
|
|
.. moduleauthor:: Guido van Rossum
|
|
|
|
.. sectionauthor:: Georg Brandl
|
|
|
|
.. much of the content adapted from docstrings
|
|
|
|
|
|
|
|
This module provides the infrastructure for defining abstract base classes
|
Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r63829 | mark.summerfield | 2008-05-31 15:05:34 +0200 (Sat, 31 May 2008) | 4 lines
Added a note to [] that special forms & special chars lose their meaning
and backrefs can't be used inside []
........
r63830 | georg.brandl | 2008-05-31 16:40:09 +0200 (Sat, 31 May 2008) | 2 lines
#3010: clarification about stdin/use_rawinput.
........
r63831 | georg.brandl | 2008-05-31 16:45:55 +0200 (Sat, 31 May 2008) | 2 lines
#3005: add explaining sentence to easydialogs docs.
........
r63858 | georg.brandl | 2008-06-01 18:41:31 +0200 (Sun, 01 Jun 2008) | 2 lines
Add plain text make target.
........
r63865 | georg.brandl | 2008-06-01 21:24:36 +0200 (Sun, 01 Jun 2008) | 2 lines
Spaces vs. tabs.
........
r63879 | gregory.p.smith | 2008-06-02 00:57:47 +0200 (Mon, 02 Jun 2008) | 3 lines
Make the _H #define's match the header file names. Fix comments to
mention the correct type names.
........
r63882 | gregory.p.smith | 2008-06-02 01:48:47 +0200 (Mon, 02 Jun 2008) | 3 lines
Adds a Thread.getIdent() method to provide the _get_ident() value for
any given threading.Thread object. feature request issue 2871.
........
r63948 | alexandre.vassalotti | 2008-06-04 22:41:44 +0200 (Wed, 04 Jun 2008) | 2 lines
Fixed complex.__getnewargs__() to not emit another complex object.
........
r63970 | andrew.kuchling | 2008-06-06 01:33:54 +0200 (Fri, 06 Jun 2008) | 1 line
Document 'utc' parameter
........
r63971 | andrew.kuchling | 2008-06-06 01:35:31 +0200 (Fri, 06 Jun 2008) | 1 line
Add various items
........
r63972 | andrew.kuchling | 2008-06-06 01:35:48 +0200 (Fri, 06 Jun 2008) | 1 line
Grammar fix
........
r63976 | georg.brandl | 2008-06-06 09:34:50 +0200 (Fri, 06 Jun 2008) | 2 lines
Markup fix.
........
r63989 | thomas.heller | 2008-06-06 20:42:11 +0200 (Fri, 06 Jun 2008) | 2 lines
Add a reminder for the maintainer of whatsnew.
........
r64014 | georg.brandl | 2008-06-07 17:59:10 +0200 (Sat, 07 Jun 2008) | 3 lines
Factor out docstring dedenting from inspect.getdoc() into inspect.cleandoc()
to ease standalone use of the algorithm.
........
r64015 | georg.brandl | 2008-06-07 18:04:01 +0200 (Sat, 07 Jun 2008) | 2 lines
Revert unwanted changes.
........
r64021 | georg.brandl | 2008-06-07 20:16:12 +0200 (Sat, 07 Jun 2008) | 2 lines
X-ref to numbers module.
........
r64022 | georg.brandl | 2008-06-07 20:17:37 +0200 (Sat, 07 Jun 2008) | 3 lines
Document the "st" API, to avoid confusion with the "new" AST.
Add a note about using the new AST module.
........
r64063 | martin.v.loewis | 2008-06-10 07:03:35 +0200 (Tue, 10 Jun 2008) | 2 lines
Add Gregor Lingl.
........
r64064 | georg.brandl | 2008-06-10 09:45:28 +0200 (Tue, 10 Jun 2008) | 2 lines
Add the "ast" module, containing helpers to ease use of the "_ast" classes.
........
r64065 | raymond.hettinger | 2008-06-10 09:57:15 +0200 (Tue, 10 Jun 2008) | 1 line
Add Arnaud for his efforts on multi-arg set operations.
........
r64067 | georg.brandl | 2008-06-10 14:46:39 +0200 (Tue, 10 Jun 2008) | 2 lines
#2536: fix itertools.permutations and itertools.combinations docstrings.
........
2008-06-10 16:37:50 +00:00
|
|
|
(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.)
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
The :mod:`collections` module has some concrete classes that derive from
|
|
|
|
ABCs; these can, of course, be further derived. In addition the
|
|
|
|
:mod:`collections` module has some ABCs that can be used to test whether
|
|
|
|
a class or instance provides a particular interface, for example, is it
|
|
|
|
hashable or a mapping.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
This module provides the following class:
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
.. class:: ABCMeta
|
|
|
|
|
|
|
|
Metaclass for defining Abstract Base Classes (ABCs).
|
|
|
|
|
|
|
|
Use this metaclass to create an ABC. An ABC can be subclassed directly, and
|
|
|
|
then acts as a mix-in class. You can also register unrelated concrete
|
|
|
|
classes (even built-in classes) and unrelated ABCs as "virtual subclasses" --
|
|
|
|
these and their descendants will be considered subclasses of the registering
|
|
|
|
ABC by the built-in :func:`issubclass` function, but the registering ABC
|
|
|
|
won't show up in their MRO (Method Resolution Order) nor will method
|
|
|
|
implementations defined by the registering ABC be callable (not even via
|
2007-09-05 08:43:04 +00:00
|
|
|
:func:`super`). [#]_
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
Classes created with a metaclass of :class:`ABCMeta` have the following method:
|
|
|
|
|
|
|
|
.. method:: register(subclass)
|
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
Register *subclass* as a "virtual subclass" of this ABC. For
|
|
|
|
example::
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
from abc import ABCMeta
|
|
|
|
|
|
|
|
class MyABC(metaclass=ABCMeta):
|
|
|
|
pass
|
|
|
|
|
|
|
|
MyABC.register(tuple)
|
|
|
|
|
|
|
|
assert issubclass(tuple, MyABC)
|
|
|
|
assert isinstance((), MyABC)
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
You can also override this method in an abstract base class:
|
|
|
|
|
|
|
|
.. method:: __subclasshook__(subclass)
|
|
|
|
|
|
|
|
(Must be defined as a class method.)
|
|
|
|
|
|
|
|
Check whether *subclass* is considered a subclass of this ABC. This means
|
|
|
|
that you can customize the behavior of ``issubclass`` further without the
|
|
|
|
need to call :meth:`register` on every class you want to consider a
|
2007-09-04 15:45:25 +00:00
|
|
|
subclass of the ABC. (This class method is called from the
|
|
|
|
:meth:`__subclasscheck__` method of the ABC.)
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
This method should return ``True``, ``False`` or ``NotImplemented``. If
|
|
|
|
it returns ``True``, the *subclass* is considered a subclass of this ABC.
|
|
|
|
If it returns ``False``, the *subclass* is not considered a subclass of
|
|
|
|
this ABC, even if it would normally be one. If it returns
|
|
|
|
``NotImplemented``, the subclass check is continued with the usual
|
|
|
|
mechanism.
|
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
.. XXX explain the "usual mechanism"
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
For a demonstration of these concepts, look at this example ABC definition::
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
class Foo:
|
|
|
|
def __getitem__(self, index):
|
|
|
|
...
|
|
|
|
def __len__(self):
|
|
|
|
...
|
|
|
|
def get_iterator(self):
|
|
|
|
return iter(self)
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
class MyIterable(metaclass=ABCMeta):
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
@abstractmethod
|
2007-09-04 08:11:03 +00:00
|
|
|
def __iter__(self):
|
2007-09-04 15:45:25 +00:00
|
|
|
while False:
|
|
|
|
yield None
|
|
|
|
|
|
|
|
def get_iterator(self):
|
|
|
|
return self.__iter__()
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def __subclasshook__(cls, C):
|
2007-09-04 15:45:25 +00:00
|
|
|
if cls is MyIterable:
|
|
|
|
if any("__iter__" in B.__dict__ for B in C.__mro__):
|
2007-09-04 08:11:03 +00:00
|
|
|
return True
|
|
|
|
return NotImplemented
|
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
MyIterable.register(Foo)
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
The ABC ``MyIterable`` defines the standard iterable method,
|
|
|
|
:meth:`__iter__`, as an abstract method. The implementation given here can
|
|
|
|
still be called from subclasses. The :meth:`get_iterator` method is also
|
|
|
|
part of the ``MyIterable`` abstract base class, but it does not have to be
|
2007-09-05 08:43:04 +00:00
|
|
|
overridden in non-abstract derived classes.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
The :meth:`__subclasshook__` class method defined here says that any class
|
2007-09-04 15:45:25 +00:00
|
|
|
that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of
|
2007-09-05 08:43:04 +00:00
|
|
|
one of its base classes, accessed via the :attr:`__mro__` list) is
|
|
|
|
considered a ``MyIterable`` too.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
|
2007-09-05 08:43:04 +00:00
|
|
|
even though it does not define an :meth:`__iter__` method (it uses the
|
2007-09-04 15:45:25 +00:00
|
|
|
old-style iterable protocol, defined in terms of :meth:`__len__` and
|
|
|
|
:meth:`__getitem__`). Note that this will not make ``get_iterator``
|
|
|
|
available as a method of ``Foo``, so it is provided separately.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
It also provides the following decorators:
|
|
|
|
|
|
|
|
.. function:: abstractmethod(function)
|
|
|
|
|
|
|
|
A decorator indicating abstract methods.
|
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
Using this decorator requires that the class's metaclass is :class:`ABCMeta` or
|
|
|
|
is derived from it.
|
|
|
|
A class that has a metaclass derived from :class:`ABCMeta`
|
|
|
|
cannot be instantiated unless all of its abstract methods and
|
|
|
|
properties are overridden.
|
2007-09-04 15:45:25 +00:00
|
|
|
The abstract methods can be called using any of the the normal 'super' call
|
|
|
|
mechanisms.
|
|
|
|
|
|
|
|
Dynamically adding abstract methods to a class, or attempting to modify the
|
|
|
|
abstraction status of a method or class once it is created, are not
|
|
|
|
supported. The :func:`abstractmethod` only affects subclasses derived using
|
|
|
|
regular inheritance; "virtual subclasses" registered with the ABC's
|
|
|
|
:meth:`register` method are not affected.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
Usage::
|
|
|
|
|
|
|
|
class C(metaclass=ABCMeta):
|
|
|
|
@abstractmethod
|
|
|
|
def my_abstract_method(self, ...):
|
|
|
|
...
|
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
.. note::
|
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
Unlike C++'s pure virtual functions, or Java abstract methods, these abstract
|
|
|
|
methods may have an implementation. This implementation can be
|
|
|
|
called via the :func:`super` mechanism from the class that
|
|
|
|
overrides it. This could be useful as an end-point for a
|
|
|
|
super-call in a framework that uses cooperative
|
|
|
|
multiple-inheritance.
|
2007-09-04 15:45:25 +00:00
|
|
|
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
.. function:: abstractproperty(fget[, fset[, fdel[, doc]]])
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-04 15:45:25 +00:00
|
|
|
A subclass of the built-in :func:`property`, indicating an abstract property.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
Using this function requires that the class's metaclass is :class:`ABCMeta` or
|
|
|
|
is derived from it.
|
|
|
|
A class that has a metaclass derived from :class:`ABCMeta` cannot be
|
|
|
|
instantiated unless all of its abstract methods and properties are overridden.
|
|
|
|
The abstract properties can be called using any of the normal
|
|
|
|
'super' call mechanisms.
|
2007-09-04 08:11:03 +00:00
|
|
|
|
|
|
|
Usage::
|
|
|
|
|
|
|
|
class C(metaclass=ABCMeta):
|
|
|
|
@abstractproperty
|
|
|
|
def my_abstract_property(self):
|
|
|
|
...
|
|
|
|
|
|
|
|
This defines a read-only property; you can also define a read-write abstract
|
|
|
|
property using the 'long' form of property declaration::
|
|
|
|
|
|
|
|
class C(metaclass=ABCMeta):
|
|
|
|
def getx(self): ...
|
|
|
|
def setx(self, value): ...
|
|
|
|
x = abstractproperty(getx, setx)
|
|
|
|
|
2007-09-05 08:43:04 +00:00
|
|
|
.. rubric:: Footnotes
|
|
|
|
|
|
|
|
.. [#] C++ programmers should note that Python's virtual base class
|
|
|
|
concept is not the same as C++'s.
|