blob: 70710761a39555b9151e194439747818f3ceb529 [file] [log] [blame]
Georg Brandlaeaa5462007-09-04 08:11:03 +00001:mod:`abc` --- Abstract Base Classes
2====================================
3
4.. module:: abc
5 :synopsis: Abstract base classes according to PEP 3119.
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04006
Georg Brandlaeaa5462007-09-04 08:11:03 +00007.. moduleauthor:: Guido van Rossum
8.. sectionauthor:: Georg Brandl
9.. much of the content adapted from docstrings
10
Raymond Hettingeread49752011-01-24 16:28:06 +000011**Source code:** :source:`Lib/abc.py`
12
13--------------
14
Éric Araujo8ddf7c22011-06-15 17:49:20 +020015This module provides the infrastructure for defining :term:`abstract base
Andrew Svetlovb67596d2012-12-13 19:09:33 +020016classes <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.)
Georg Brandlaeaa5462007-09-04 08:11:03 +000019
Mark Summerfield08898b42007-09-05 08:43:04 +000020The :mod:`collections` module has some concrete classes that derive from
21ABCs; these can, of course, be further derived. In addition the
Éric Araujo36226802011-06-03 20:49:39 +020022:mod:`collections.abc` submodule has some ABCs that can be used to test whether
Mark Summerfield08898b42007-09-05 08:43:04 +000023a class or instance provides a particular interface, for example, is it
24hashable or a mapping.
Georg Brandlaeaa5462007-09-04 08:11:03 +000025
26
Eric Appelt122e88a2017-08-30 17:47:52 -050027This 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
Georg Brandlaeaa5462007-09-04 08:11:03 +000054
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
Mark Summerfield08898b42007-09-05 08:43:04 +000066 :func:`super`). [#]_
Georg Brandlaeaa5462007-09-04 08:11:03 +000067
68 Classes created with a metaclass of :class:`ABCMeta` have the following method:
69
70 .. method:: register(subclass)
71
Mark Summerfield08898b42007-09-05 08:43:04 +000072 Register *subclass* as a "virtual subclass" of this ABC. For
73 example::
Georg Brandlaeaa5462007-09-04 08:11:03 +000074
Eric Appelt122e88a2017-08-30 17:47:52 -050075 from abc import ABC
Mark Summerfield08898b42007-09-05 08:43:04 +000076
Eric Appelt122e88a2017-08-30 17:47:52 -050077 class MyABC(ABC):
78 pass
Mark Summerfield08898b42007-09-05 08:43:04 +000079
Eric Appelt122e88a2017-08-30 17:47:52 -050080 MyABC.register(tuple)
Mark Summerfield08898b42007-09-05 08:43:04 +000081
Eric Appelt122e88a2017-08-30 17:47:52 -050082 assert issubclass(tuple, MyABC)
83 assert isinstance((), MyABC)
Georg Brandlaeaa5462007-09-04 08:11:03 +000084
Éric Araujo6c3787c2011-02-24 18:03:10 +000085 .. versionchanged:: 3.3
86 Returns the registered subclass, to allow usage as a class decorator.
87
Łukasz Langaeadd8cf2013-05-25 18:41:50 +020088 .. versionchanged:: 3.4
89 To detect calls to :meth:`register`, you can use the
90 :func:`get_cache_token` function.
91
Georg Brandlaeaa5462007-09-04 08:11:03 +000092 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
Georg Brandl2d140982007-09-04 15:45:25 +0000101 subclass of the ABC. (This class method is called from the
102 :meth:`__subclasscheck__` method of the ABC.)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000103
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
Georg Brandl2d140982007-09-04 15:45:25 +0000111 .. XXX explain the "usual mechanism"
Georg Brandlaeaa5462007-09-04 08:11:03 +0000112
Georg Brandlaeaa5462007-09-04 08:11:03 +0000113
Georg Brandl2d140982007-09-04 15:45:25 +0000114 For a demonstration of these concepts, look at this example ABC definition::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000115
Georg Brandl2d140982007-09-04 15:45:25 +0000116 class Foo:
117 def __getitem__(self, index):
118 ...
119 def __len__(self):
120 ...
121 def get_iterator(self):
122 return iter(self)
123
Eric Appelt122e88a2017-08-30 17:47:52 -0500124 class MyIterable(ABC):
Georg Brandlaeaa5462007-09-04 08:11:03 +0000125
126 @abstractmethod
Georg Brandlaeaa5462007-09-04 08:11:03 +0000127 def __iter__(self):
Georg Brandl2d140982007-09-04 15:45:25 +0000128 while False:
129 yield None
130
131 def get_iterator(self):
132 return self.__iter__()
Georg Brandlaeaa5462007-09-04 08:11:03 +0000133
134 @classmethod
135 def __subclasshook__(cls, C):
Georg Brandl2d140982007-09-04 15:45:25 +0000136 if cls is MyIterable:
137 if any("__iter__" in B.__dict__ for B in C.__mro__):
Georg Brandlaeaa5462007-09-04 08:11:03 +0000138 return True
139 return NotImplemented
140
Georg Brandl2d140982007-09-04 15:45:25 +0000141 MyIterable.register(Foo)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000142
Georg Brandl2d140982007-09-04 15:45:25 +0000143 The ABC ``MyIterable`` defines the standard iterable method,
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300144 :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.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000148
149 The :meth:`__subclasshook__` class method defined here says that any class
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300150 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.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000153
Georg Brandl2d140982007-09-04 15:45:25 +0000154 Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300155 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
Georg Brandl2d140982007-09-04 15:45:25 +0000157 :meth:`__getitem__`). Note that this will not make ``get_iterator``
158 available as a method of ``Foo``, so it is provided separately.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000159
160
Georg Brandl09bc6422012-12-16 13:32:33 +0100161
Andrew Svetlovb67596d2012-12-13 19:09:33 +0200162
Harshul jain52c6b892018-02-21 10:00:01 +0530163The :mod:`abc` module also provides the following decorator:
Georg Brandlaeaa5462007-09-04 08:11:03 +0000164
Éric Araujo9bc9ab52012-12-08 18:35:31 -0500165.. decorator:: abstractmethod
Georg Brandlaeaa5462007-09-04 08:11:03 +0000166
167 A decorator indicating abstract methods.
168
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500169 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.
Georg Brandl2d140982007-09-04 15:45:25 +0000175
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.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000181
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500182 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::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000185
Eric Appelt122e88a2017-08-30 17:47:52 -0500186 class C(ABC):
Georg Brandlaeaa5462007-09-04 08:11:03 +0000187 @abstractmethod
188 def my_abstract_method(self, ...):
189 ...
Benjamin Petersonbfebb7b2011-12-15 15:34:02 -0500190 @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 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))
Georg Brandlaeaa5462007-09-04 08:11:03 +0000228
Georg Brandl2d140982007-09-04 15:45:25 +0000229 .. note::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000230
Benjamin Petersonad3d5c22009-02-26 03:38:59 +0000231 Unlike Java abstract methods, these abstract
Mark Summerfield08898b42007-09-05 08:43:04 +0000232 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.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000237
Georg Brandl2d140982007-09-04 15:45:25 +0000238
Harshul jain52c6b892018-02-21 10:00:01 +0530239The :mod:`abc` module also supports the following legacy decorators:
240
Éric Araujo9bc9ab52012-12-08 18:35:31 -0500241.. decorator:: abstractclassmethod
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000242
Harshul jain52c6b892018-02-21 10:00:01 +0530243 .. 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
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000248 A subclass of the built-in :func:`classmethod`, indicating an abstract
249 classmethod. Otherwise it is similar to :func:`abstractmethod`.
250
Nick Coghlancea27be2012-12-08 22:56:02 +1000251 This special case is deprecated, as the :func:`classmethod` decorator
252 is now correctly identified as abstract when applied to an abstract
253 method::
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000254
Eric Appelt122e88a2017-08-30 17:47:52 -0500255 class C(ABC):
Nick Coghlancea27be2012-12-08 22:56:02 +1000256 @classmethod
257 @abstractmethod
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000258 def my_abstract_classmethod(cls, ...):
259 ...
260
261
Éric Araujo9bc9ab52012-12-08 18:35:31 -0500262.. decorator:: abstractstaticmethod
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000263
Harshul jain52c6b892018-02-21 10:00:01 +0530264 .. 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
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000269 A subclass of the built-in :func:`staticmethod`, indicating an abstract
270 staticmethod. Otherwise it is similar to :func:`abstractmethod`.
271
Nick Coghlancea27be2012-12-08 22:56:02 +1000272 This special case is deprecated, as the :func:`staticmethod` decorator
273 is now correctly identified as abstract when applied to an abstract
274 method::
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000275
Eric Appelt122e88a2017-08-30 17:47:52 -0500276 class C(ABC):
Nick Coghlancea27be2012-12-08 22:56:02 +1000277 @staticmethod
278 @abstractmethod
Benjamin Peterson45c257f2010-08-17 00:52:52 +0000279 def my_abstract_staticmethod(...):
280 ...
281
282
Daisuke Miyakawa0e61e672017-10-12 23:39:43 +0900283.. decorator:: abstractproperty
Georg Brandl2d140982007-09-04 15:45:25 +0000284
Harshul jain52c6b892018-02-21 10:00:01 +0530285 .. 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
Nick Coghlancea27be2012-12-08 22:56:02 +1000290 A subclass of the built-in :func:`property`, indicating an abstract
291 property.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000292
Nick Coghlancea27be2012-12-08 22:56:02 +1000293 This special case is deprecated, as the :func:`property` decorator
294 is now correctly identified as abstract when applied to an abstract
295 method::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000296
Eric Appelt122e88a2017-08-30 17:47:52 -0500297 class C(ABC):
Nick Coghlancea27be2012-12-08 22:56:02 +1000298 @property
299 @abstractmethod
Georg Brandlaeaa5462007-09-04 08:11:03 +0000300 def my_abstract_property(self):
301 ...
302
Nick Coghlancea27be2012-12-08 22:56:02 +1000303 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::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000306
Eric Appelt122e88a2017-08-30 17:47:52 -0500307 class C(ABC):
Nick Coghlancea27be2012-12-08 22:56:02 +1000308 @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
Georg Brandlaeaa5462007-09-04 08:11:03 +0000325
Łukasz Langaeadd8cf2013-05-25 18:41:50 +0200326The :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
R David Murray3edcc782013-12-24 16:13:32 -0500332 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.
Łukasz Langaeadd8cf2013-05-25 18:41:50 +0200335
336 .. versionadded:: 3.4
337
338
Mark Summerfield08898b42007-09-05 08:43:04 +0000339.. rubric:: Footnotes
340
341.. [#] C++ programmers should note that Python's virtual base class
342 concept is not the same as C++'s.