blob: 54f7a5f1c6a2e628a04ed719c0d71f526c5bb57f [file] [log] [blame]
Éric Araujof90112e2011-06-03 19:18:41 +02001.. _abstract-base-classes:
2
Georg Brandlaeaa5462007-09-04 08:11:03 +00003:mod:`abc` --- Abstract Base Classes
4====================================
5
6.. module:: abc
7 :synopsis: Abstract base classes according to PEP 3119.
8.. moduleauthor:: Guido van Rossum
9.. sectionauthor:: Georg Brandl
10.. much of the content adapted from docstrings
11
Raymond Hettingeread49752011-01-24 16:28:06 +000012**Source code:** :source:`Lib/abc.py`
13
14--------------
15
Georg Brandl86b2fb92008-07-16 03:43:04 +000016This module provides the infrastructure for defining an :term:`abstract base
Éric Araujof90112e2011-06-03 19:18:41 +020017class` (ABC) in Python, as outlined in :pep:`3119`; see the PEP for why this
Benjamin Peterson41181742008-07-02 20:22:54 +000018was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
19regarding a type hierarchy for numbers based on ABCs.)
Georg Brandlaeaa5462007-09-04 08:11:03 +000020
Mark Summerfield08898b42007-09-05 08:43:04 +000021The :mod:`collections` module has some concrete classes that derive from
22ABCs; these can, of course, be further derived. In addition the
Éric Araujo36226802011-06-03 20:49:39 +020023:mod:`collections.abc` submodule has some ABCs that can be used to test whether
Mark Summerfield08898b42007-09-05 08:43:04 +000024a class or instance provides a particular interface, for example, is it
25hashable or a mapping.
Georg Brandlaeaa5462007-09-04 08:11:03 +000026
27
Mark Summerfield08898b42007-09-05 08:43:04 +000028This module provides the following class:
Georg Brandlaeaa5462007-09-04 08:11:03 +000029
30.. class:: ABCMeta
31
32 Metaclass for defining Abstract Base Classes (ABCs).
33
34 Use this metaclass to create an ABC. An ABC can be subclassed directly, and
35 then acts as a mix-in class. You can also register unrelated concrete
36 classes (even built-in classes) and unrelated ABCs as "virtual subclasses" --
37 these and their descendants will be considered subclasses of the registering
38 ABC by the built-in :func:`issubclass` function, but the registering ABC
39 won't show up in their MRO (Method Resolution Order) nor will method
40 implementations defined by the registering ABC be callable (not even via
Mark Summerfield08898b42007-09-05 08:43:04 +000041 :func:`super`). [#]_
Georg Brandlaeaa5462007-09-04 08:11:03 +000042
43 Classes created with a metaclass of :class:`ABCMeta` have the following method:
44
45 .. method:: register(subclass)
46
Mark Summerfield08898b42007-09-05 08:43:04 +000047 Register *subclass* as a "virtual subclass" of this ABC. For
48 example::
Georg Brandlaeaa5462007-09-04 08:11:03 +000049
Georg Brandla1c6a1c2009-01-03 21:26:05 +000050 from abc import ABCMeta
Mark Summerfield08898b42007-09-05 08:43:04 +000051
Georg Brandla1c6a1c2009-01-03 21:26:05 +000052 class MyABC(metaclass=ABCMeta):
53 pass
Mark Summerfield08898b42007-09-05 08:43:04 +000054
Georg Brandla1c6a1c2009-01-03 21:26:05 +000055 MyABC.register(tuple)
Mark Summerfield08898b42007-09-05 08:43:04 +000056
Georg Brandla1c6a1c2009-01-03 21:26:05 +000057 assert issubclass(tuple, MyABC)
58 assert isinstance((), MyABC)
Georg Brandlaeaa5462007-09-04 08:11:03 +000059
Éric Araujo6c3787c2011-02-24 18:03:10 +000060 .. versionchanged:: 3.3
61 Returns the registered subclass, to allow usage as a class decorator.
62
Georg Brandlaeaa5462007-09-04 08:11:03 +000063 You can also override this method in an abstract base class:
64
65 .. method:: __subclasshook__(subclass)
66
67 (Must be defined as a class method.)
68
69 Check whether *subclass* is considered a subclass of this ABC. This means
70 that you can customize the behavior of ``issubclass`` further without the
71 need to call :meth:`register` on every class you want to consider a
Georg Brandl2d140982007-09-04 15:45:25 +000072 subclass of the ABC. (This class method is called from the
73 :meth:`__subclasscheck__` method of the ABC.)
Georg Brandlaeaa5462007-09-04 08:11:03 +000074
75 This method should return ``True``, ``False`` or ``NotImplemented``. If
76 it returns ``True``, the *subclass* is considered a subclass of this ABC.
77 If it returns ``False``, the *subclass* is not considered a subclass of
78 this ABC, even if it would normally be one. If it returns
79 ``NotImplemented``, the subclass check is continued with the usual
80 mechanism.
81
Georg Brandl2d140982007-09-04 15:45:25 +000082 .. XXX explain the "usual mechanism"
Georg Brandlaeaa5462007-09-04 08:11:03 +000083
Georg Brandlaeaa5462007-09-04 08:11:03 +000084
Georg Brandl2d140982007-09-04 15:45:25 +000085 For a demonstration of these concepts, look at this example ABC definition::
Georg Brandlaeaa5462007-09-04 08:11:03 +000086
Georg Brandl2d140982007-09-04 15:45:25 +000087 class Foo:
88 def __getitem__(self, index):
89 ...
90 def __len__(self):
91 ...
92 def get_iterator(self):
93 return iter(self)
94
95 class MyIterable(metaclass=ABCMeta):
Georg Brandlaeaa5462007-09-04 08:11:03 +000096
97 @abstractmethod
Georg Brandlaeaa5462007-09-04 08:11:03 +000098 def __iter__(self):
Georg Brandl2d140982007-09-04 15:45:25 +000099 while False:
100 yield None
101
102 def get_iterator(self):
103 return self.__iter__()
Georg Brandlaeaa5462007-09-04 08:11:03 +0000104
105 @classmethod
106 def __subclasshook__(cls, C):
Georg Brandl2d140982007-09-04 15:45:25 +0000107 if cls is MyIterable:
108 if any("__iter__" in B.__dict__ for B in C.__mro__):
Georg Brandlaeaa5462007-09-04 08:11:03 +0000109 return True
110 return NotImplemented
111
Georg Brandl2d140982007-09-04 15:45:25 +0000112 MyIterable.register(Foo)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000113
Georg Brandl2d140982007-09-04 15:45:25 +0000114 The ABC ``MyIterable`` defines the standard iterable method,
115 :meth:`__iter__`, as an abstract method. The implementation given here can
116 still be called from subclasses. The :meth:`get_iterator` method is also
117 part of the ``MyIterable`` abstract base class, but it does not have to be
Mark Summerfield08898b42007-09-05 08:43:04 +0000118 overridden in non-abstract derived classes.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000119
120 The :meth:`__subclasshook__` class method defined here says that any class
Georg Brandl2d140982007-09-04 15:45:25 +0000121 that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of
Mark Summerfield08898b42007-09-05 08:43:04 +0000122 one of its base classes, accessed via the :attr:`__mro__` list) is
123 considered a ``MyIterable`` too.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000124
Georg Brandl2d140982007-09-04 15:45:25 +0000125 Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
Mark Summerfield08898b42007-09-05 08:43:04 +0000126 even though it does not define an :meth:`__iter__` method (it uses the
Georg Brandl2d140982007-09-04 15:45:25 +0000127 old-style iterable protocol, defined in terms of :meth:`__len__` and
128 :meth:`__getitem__`). Note that this will not make ``get_iterator``
129 available as a method of ``Foo``, so it is provided separately.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000130
131
132It also provides the following decorators:
133
Georg Brandl8a1caa22010-07-29 16:01:11 +0000134.. decorator:: abstractmethod(function)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000135
136 A decorator indicating abstract methods.
137
Mark Summerfield08898b42007-09-05 08:43:04 +0000138 Using this decorator requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandl48310cd2009-01-03 21:18:54 +0000139 is derived from it.
Mark Summerfield08898b42007-09-05 08:43:04 +0000140 A class that has a metaclass derived from :class:`ABCMeta`
141 cannot be instantiated unless all of its abstract methods and
142 properties are overridden.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000143 The abstract methods can be called using any of the normal 'super' call
Georg Brandl2d140982007-09-04 15:45:25 +0000144 mechanisms.
145
146 Dynamically adding abstract methods to a class, or attempting to modify the
147 abstraction status of a method or class once it is created, are not
148 supported. The :func:`abstractmethod` only affects subclasses derived using
149 regular inheritance; "virtual subclasses" registered with the ABC's
150 :meth:`register` method are not affected.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000151
152 Usage::
153
154 class C(metaclass=ABCMeta):
155 @abstractmethod
156 def my_abstract_method(self, ...):
157 ...
158
Georg Brandl2d140982007-09-04 15:45:25 +0000159 .. note::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000160
Benjamin Petersonad3d5c22009-02-26 03:38:59 +0000161 Unlike Java abstract methods, these abstract
Mark Summerfield08898b42007-09-05 08:43:04 +0000162 methods may have an implementation. This implementation can be
163 called via the :func:`super` mechanism from the class that
164 overrides it. This could be useful as an end-point for a
165 super-call in a framework that uses cooperative
166 multiple-inheritance.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000167
Georg Brandl2d140982007-09-04 15:45:25 +0000168
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000169.. decorator:: abstractclassmethod(function)
170
171 A subclass of the built-in :func:`classmethod`, indicating an abstract
172 classmethod. Otherwise it is similar to :func:`abstractmethod`.
173
174 Usage::
175
176 class C(metaclass=ABCMeta):
177 @abstractclassmethod
178 def my_abstract_classmethod(cls, ...):
179 ...
180
Benjamin Petersonad1e0c52010-08-17 03:37:20 +0000181 .. versionadded:: 3.2
182
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000183
184.. decorator:: abstractstaticmethod(function)
185
186 A subclass of the built-in :func:`staticmethod`, indicating an abstract
187 staticmethod. Otherwise it is similar to :func:`abstractmethod`.
188
189 Usage::
190
191 class C(metaclass=ABCMeta):
192 @abstractstaticmethod
193 def my_abstract_staticmethod(...):
194 ...
195
Benjamin Petersonad1e0c52010-08-17 03:37:20 +0000196 .. versionadded:: 3.2
197
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000198
Georg Brandlb868a662009-04-02 02:56:10 +0000199.. function:: abstractproperty(fget=None, fset=None, fdel=None, doc=None)
Georg Brandl2d140982007-09-04 15:45:25 +0000200
201 A subclass of the built-in :func:`property`, indicating an abstract property.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000202
Mark Summerfield08898b42007-09-05 08:43:04 +0000203 Using this function requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandl48310cd2009-01-03 21:18:54 +0000204 is derived from it.
Mark Summerfield08898b42007-09-05 08:43:04 +0000205 A class that has a metaclass derived from :class:`ABCMeta` cannot be
206 instantiated unless all of its abstract methods and properties are overridden.
207 The abstract properties can be called using any of the normal
208 'super' call mechanisms.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000209
210 Usage::
211
212 class C(metaclass=ABCMeta):
213 @abstractproperty
214 def my_abstract_property(self):
215 ...
216
217 This defines a read-only property; you can also define a read-write abstract
218 property using the 'long' form of property declaration::
219
220 class C(metaclass=ABCMeta):
221 def getx(self): ...
222 def setx(self, value): ...
223 x = abstractproperty(getx, setx)
224
Benjamin Petersond23f8222009-04-05 19:13:16 +0000225
Mark Summerfield08898b42007-09-05 08:43:04 +0000226.. rubric:: Footnotes
227
228.. [#] C++ programmers should note that Python's virtual base class
229 concept is not the same as C++'s.