1:mod:`abc` --- Abstract Base Classes
2====================================
3
4.. module:: abc
5   :synopsis: Abstract base classes according to PEP 3119.
6
7.. moduleauthor:: Guido van Rossum
8.. sectionauthor:: Georg Brandl
9.. much of the content adapted from docstrings
10
11**Source code:** :source:`Lib/abc.py`
12
13--------------
14
15This module provides the infrastructure for defining :term:`abstract base
16classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`;
17see the PEP for why this was added to Python. (See also :pep:`3141` and the
18:mod:`numbers` module regarding a type hierarchy for numbers based on ABCs.)
19
20The :mod:`collections` module has some concrete classes that derive from
21ABCs; these can, of course, be further derived. In addition, the
22:mod:`collections.abc` submodule has some ABCs that can be used to test whether
23a class or instance provides a particular interface, for example, if it is
24hashable or if it is a mapping.
25
26
27This module provides the metaclass :class:`ABCMeta` for defining ABCs and
28a helper class :class:`ABC` to alternatively define ABCs through inheritance:
29
30.. class:: ABC
31
32   A helper class that has :class:`ABCMeta` as its metaclass.  With this class,
33   an abstract base class can be created by simply deriving from :class:`ABC`
34   avoiding sometimes confusing metaclass usage, for example::
35
36     from abc import ABC
37
38     class MyABC(ABC):
39         pass
40
41   Note that the type of :class:`ABC` is still :class:`ABCMeta`, therefore
42   inheriting from :class:`ABC` requires the usual precautions regarding
43   metaclass usage, as multiple inheritance may lead to metaclass conflicts.
44   One may also define an abstract base class by passing the metaclass
45   keyword and using :class:`ABCMeta` directly, for example::
46
47     from abc import ABCMeta
48
49     class MyABC(metaclass=ABCMeta):
50         pass
51
52   .. versionadded:: 3.4
53
54
55.. class:: ABCMeta
56
57   Metaclass for defining Abstract Base Classes (ABCs).
58
59   Use this metaclass to create an ABC.  An ABC can be subclassed directly, and
60   then acts as a mix-in class.  You can also register unrelated concrete
61   classes (even built-in classes) and unrelated ABCs as "virtual subclasses" --
62   these and their descendants will be considered subclasses of the registering
63   ABC by the built-in :func:`issubclass` function, but the registering ABC
64   won't show up in their MRO (Method Resolution Order) nor will method
65   implementations defined by the registering ABC be callable (not even via
66   :func:`super`). [#]_
67
68   Classes created with a metaclass of :class:`ABCMeta` have the following method:
69
70   .. method:: register(subclass)
71
72      Register *subclass* as a "virtual subclass" of this ABC. For
73      example::
74
75         from abc import ABC
76
77         class MyABC(ABC):
78             pass
79
80         MyABC.register(tuple)
81
82         assert issubclass(tuple, MyABC)
83         assert isinstance((), MyABC)
84
85      .. versionchanged:: 3.3
86         Returns the registered subclass, to allow usage as a class decorator.
87
88      .. versionchanged:: 3.4
89         To detect calls to :meth:`register`, you can use the
90         :func:`get_cache_token` function.
91
92   You can also override this method in an abstract base class:
93
94   .. method:: __subclasshook__(subclass)
95
96      (Must be defined as a class method.)
97
98      Check whether *subclass* is considered a subclass of this ABC.  This means
99      that you can customize the behavior of ``issubclass`` further without the
100      need to call :meth:`register` on every class you want to consider a
101      subclass of the ABC.  (This class method is called from the
102      :meth:`__subclasscheck__` method of the ABC.)
103
104      This method should return ``True``, ``False`` or ``NotImplemented``.  If
105      it returns ``True``, the *subclass* is considered a subclass of this ABC.
106      If it returns ``False``, the *subclass* is not considered a subclass of
107      this ABC, even if it would normally be one.  If it returns
108      ``NotImplemented``, the subclass check is continued with the usual
109      mechanism.
110
111      .. XXX explain the "usual mechanism"
112
113
114   For a demonstration of these concepts, look at this example ABC definition::
115
116      class Foo:
117          def __getitem__(self, index):
118              ...
119          def __len__(self):
120              ...
121          def get_iterator(self):
122              return iter(self)
123
124      class MyIterable(ABC):
125
126          @abstractmethod
127          def __iter__(self):
128              while False:
129                  yield None
130
131          def get_iterator(self):
132              return self.__iter__()
133
134          @classmethod
135          def __subclasshook__(cls, C):
136              if cls is MyIterable:
137                  if any("__iter__" in B.__dict__ for B in C.__mro__):
138                      return True
139              return NotImplemented
140
141      MyIterable.register(Foo)
142
143   The ABC ``MyIterable`` defines the standard iterable method,
144   :meth:`~iterator.__iter__`, as an abstract method.  The implementation given
145   here can still be called from subclasses.  The :meth:`get_iterator` method
146   is also part of the ``MyIterable`` abstract base class, but it does not have
147   to be overridden in non-abstract derived classes.
148
149   The :meth:`__subclasshook__` class method defined here says that any class
150   that has an :meth:`~iterator.__iter__` method in its
151   :attr:`~object.__dict__` (or in that of one of its base classes, accessed
152   via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too.
153
154   Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
155   even though it does not define an :meth:`~iterator.__iter__` method (it uses
156   the old-style iterable protocol, defined in terms of :meth:`__len__` and
157   :meth:`__getitem__`).  Note that this will not make ``get_iterator``
158   available as a method of ``Foo``, so it is provided separately.
159
160
161
162
163The :mod:`abc` module also provides the following decorator:
164
165.. decorator:: abstractmethod
166
167   A decorator indicating abstract methods.
168
169   Using this decorator requires that the class's metaclass is :class:`ABCMeta`
170   or is derived from it.  A class that has a metaclass derived from
171   :class:`ABCMeta` cannot be instantiated unless all of its abstract methods
172   and properties are overridden.  The abstract methods can be called using any
173   of the normal 'super' call mechanisms.  :func:`abstractmethod` may be used
174   to declare abstract methods for properties and descriptors.
175
176   Dynamically adding abstract methods to a class, or attempting to modify the
177   abstraction status of a method or class once it is created, are not
178   supported.  The :func:`abstractmethod` only affects subclasses derived using
179   regular inheritance; "virtual subclasses" registered with the ABC's
180   :meth:`register` method are not affected.
181
182   When :func:`abstractmethod` is applied in combination with other method
183   descriptors, it should be applied as the innermost decorator, as shown in
184   the following usage examples::
185
186      class C(ABC):
187          @abstractmethod
188          def my_abstract_method(self, ...):
189              ...
190          @classmethod
191          @abstractmethod
192          def my_abstract_classmethod(cls, ...):
193              ...
194          @staticmethod
195          @abstractmethod
196          def my_abstract_staticmethod(...):
197              ...
198
199          @property
200          @abstractmethod
201          def my_abstract_property(self):
202              ...
203          @my_abstract_property.setter
204          @abstractmethod
205          def my_abstract_property(self, val):
206              ...
207
208          @abstractmethod
209          def _get_x(self):
210              ...
211          @abstractmethod
212          def _set_x(self, val):
213              ...
214          x = property(_get_x, _set_x)
215
216   In order to correctly interoperate with the abstract base class machinery,
217   the descriptor must identify itself as abstract using
218   :attr:`__isabstractmethod__`. In general, this attribute should be ``True``
219   if any of the methods used to compose the descriptor are abstract. For
220   example, Python's built-in :class:`property` does the equivalent of::
221
222      class Descriptor:
223          ...
224          @property
225          def __isabstractmethod__(self):
226              return any(getattr(f, '__isabstractmethod__', False) for
227                         f in (self._fget, self._fset, self._fdel))
228
229   .. note::
230
231      Unlike Java abstract methods, these abstract
232      methods may have an implementation. This implementation can be
233      called via the :func:`super` mechanism from the class that
234      overrides it.  This could be useful as an end-point for a
235      super-call in a framework that uses cooperative
236      multiple-inheritance.
237
238
239The :mod:`abc` module also supports the following legacy decorators:
240
241.. decorator:: abstractclassmethod
242
243   .. versionadded:: 3.2
244   .. deprecated:: 3.3
245       It is now possible to use :class:`classmethod` with
246       :func:`abstractmethod`, making this decorator redundant.
247
248   A subclass of the built-in :func:`classmethod`, indicating an abstract
249   classmethod. Otherwise it is similar to :func:`abstractmethod`.
250
251   This special case is deprecated, as the :func:`classmethod` decorator
252   is now correctly identified as abstract when applied to an abstract
253   method::
254
255      class C(ABC):
256          @classmethod
257          @abstractmethod
258          def my_abstract_classmethod(cls, ...):
259              ...
260
261
262.. decorator:: abstractstaticmethod
263
264   .. versionadded:: 3.2
265   .. deprecated:: 3.3
266       It is now possible to use :class:`staticmethod` with
267       :func:`abstractmethod`, making this decorator redundant.
268
269   A subclass of the built-in :func:`staticmethod`, indicating an abstract
270   staticmethod. Otherwise it is similar to :func:`abstractmethod`.
271
272   This special case is deprecated, as the :func:`staticmethod` decorator
273   is now correctly identified as abstract when applied to an abstract
274   method::
275
276      class C(ABC):
277          @staticmethod
278          @abstractmethod
279          def my_abstract_staticmethod(...):
280              ...
281
282
283.. decorator:: abstractproperty
284
285   .. deprecated:: 3.3
286       It is now possible to use :class:`property`, :meth:`property.getter`,
287       :meth:`property.setter` and :meth:`property.deleter` with
288       :func:`abstractmethod`, making this decorator redundant.
289
290   A subclass of the built-in :func:`property`, indicating an abstract
291   property.
292
293   This special case is deprecated, as the :func:`property` decorator
294   is now correctly identified as abstract when applied to an abstract
295   method::
296
297      class C(ABC):
298          @property
299          @abstractmethod
300          def my_abstract_property(self):
301              ...
302
303   The above example defines a read-only property; you can also define a
304   read-write abstract property by appropriately marking one or more of the
305   underlying methods as abstract::
306
307      class C(ABC):
308          @property
309          def x(self):
310              ...
311
312          @x.setter
313          @abstractmethod
314          def x(self, val):
315              ...
316
317   If only some components are abstract, only those components need to be
318   updated to create a concrete property in a subclass::
319
320      class D(C):
321          @C.x.setter
322          def x(self, val):
323              ...
324
325
326The :mod:`abc` module also provides the following functions:
327
328.. function:: get_cache_token()
329
330   Returns the current abstract base class cache token.
331
332   The token is an opaque object (that supports equality testing) identifying
333   the current version of the abstract base class cache for virtual subclasses.
334   The token changes with every call to :meth:`ABCMeta.register` on any ABC.
335
336   .. versionadded:: 3.4
337
338
339.. rubric:: Footnotes
340
341.. [#] C++ programmers should note that Python's virtual base class
342   concept is not the same as C++'s.
343