blob: 5e87e969b544ef9ca56f08bca0ab2df43dd3c305 [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.
6.. moduleauthor:: Guido van Rossum
7.. sectionauthor:: Georg Brandl
8.. much of the content adapted from docstrings
9
Georg Brandl86b2fb92008-07-16 03:43:04 +000010This module provides the infrastructure for defining an :term:`abstract base
11class` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this
Benjamin Peterson41181742008-07-02 20:22:54 +000012was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
13regarding a type hierarchy for numbers based on ABCs.)
Georg Brandlaeaa5462007-09-04 08:11:03 +000014
Mark Summerfield08898b42007-09-05 08:43:04 +000015The :mod:`collections` module has some concrete classes that derive from
16ABCs; these can, of course, be further derived. In addition the
17:mod:`collections` module has some ABCs that can be used to test whether
18a class or instance provides a particular interface, for example, is it
19hashable or a mapping.
Georg Brandlaeaa5462007-09-04 08:11:03 +000020
21
Mark Summerfield08898b42007-09-05 08:43:04 +000022This module provides the following class:
Georg Brandlaeaa5462007-09-04 08:11:03 +000023
24.. class:: ABCMeta
25
26 Metaclass for defining Abstract Base Classes (ABCs).
27
28 Use this metaclass to create an ABC. An ABC can be subclassed directly, and
29 then acts as a mix-in class. You can also register unrelated concrete
30 classes (even built-in classes) and unrelated ABCs as "virtual subclasses" --
31 these and their descendants will be considered subclasses of the registering
32 ABC by the built-in :func:`issubclass` function, but the registering ABC
33 won't show up in their MRO (Method Resolution Order) nor will method
34 implementations defined by the registering ABC be callable (not even via
Mark Summerfield08898b42007-09-05 08:43:04 +000035 :func:`super`). [#]_
Georg Brandlaeaa5462007-09-04 08:11:03 +000036
37 Classes created with a metaclass of :class:`ABCMeta` have the following method:
38
39 .. method:: register(subclass)
40
Mark Summerfield08898b42007-09-05 08:43:04 +000041 Register *subclass* as a "virtual subclass" of this ABC. For
42 example::
Georg Brandlaeaa5462007-09-04 08:11:03 +000043
Georg Brandla1c6a1c2009-01-03 21:26:05 +000044 from abc import ABCMeta
Mark Summerfield08898b42007-09-05 08:43:04 +000045
Georg Brandla1c6a1c2009-01-03 21:26:05 +000046 class MyABC(metaclass=ABCMeta):
47 pass
Mark Summerfield08898b42007-09-05 08:43:04 +000048
Georg Brandla1c6a1c2009-01-03 21:26:05 +000049 MyABC.register(tuple)
Mark Summerfield08898b42007-09-05 08:43:04 +000050
Georg Brandla1c6a1c2009-01-03 21:26:05 +000051 assert issubclass(tuple, MyABC)
52 assert isinstance((), MyABC)
Georg Brandlaeaa5462007-09-04 08:11:03 +000053
54 You can also override this method in an abstract base class:
55
56 .. method:: __subclasshook__(subclass)
57
58 (Must be defined as a class method.)
59
60 Check whether *subclass* is considered a subclass of this ABC. This means
61 that you can customize the behavior of ``issubclass`` further without the
62 need to call :meth:`register` on every class you want to consider a
Georg Brandl2d140982007-09-04 15:45:25 +000063 subclass of the ABC. (This class method is called from the
64 :meth:`__subclasscheck__` method of the ABC.)
Georg Brandlaeaa5462007-09-04 08:11:03 +000065
66 This method should return ``True``, ``False`` or ``NotImplemented``. If
67 it returns ``True``, the *subclass* is considered a subclass of this ABC.
68 If it returns ``False``, the *subclass* is not considered a subclass of
69 this ABC, even if it would normally be one. If it returns
70 ``NotImplemented``, the subclass check is continued with the usual
71 mechanism.
72
Georg Brandl2d140982007-09-04 15:45:25 +000073 .. XXX explain the "usual mechanism"
Georg Brandlaeaa5462007-09-04 08:11:03 +000074
Georg Brandlaeaa5462007-09-04 08:11:03 +000075
Georg Brandl2d140982007-09-04 15:45:25 +000076 For a demonstration of these concepts, look at this example ABC definition::
Georg Brandlaeaa5462007-09-04 08:11:03 +000077
Georg Brandl2d140982007-09-04 15:45:25 +000078 class Foo:
79 def __getitem__(self, index):
80 ...
81 def __len__(self):
82 ...
83 def get_iterator(self):
84 return iter(self)
85
86 class MyIterable(metaclass=ABCMeta):
Georg Brandlaeaa5462007-09-04 08:11:03 +000087
88 @abstractmethod
Georg Brandlaeaa5462007-09-04 08:11:03 +000089 def __iter__(self):
Georg Brandl2d140982007-09-04 15:45:25 +000090 while False:
91 yield None
92
93 def get_iterator(self):
94 return self.__iter__()
Georg Brandlaeaa5462007-09-04 08:11:03 +000095
96 @classmethod
97 def __subclasshook__(cls, C):
Georg Brandl2d140982007-09-04 15:45:25 +000098 if cls is MyIterable:
99 if any("__iter__" in B.__dict__ for B in C.__mro__):
Georg Brandlaeaa5462007-09-04 08:11:03 +0000100 return True
101 return NotImplemented
102
Georg Brandl2d140982007-09-04 15:45:25 +0000103 MyIterable.register(Foo)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000104
Georg Brandl2d140982007-09-04 15:45:25 +0000105 The ABC ``MyIterable`` defines the standard iterable method,
106 :meth:`__iter__`, as an abstract method. The implementation given here can
107 still be called from subclasses. The :meth:`get_iterator` method is also
108 part of the ``MyIterable`` abstract base class, but it does not have to be
Mark Summerfield08898b42007-09-05 08:43:04 +0000109 overridden in non-abstract derived classes.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000110
111 The :meth:`__subclasshook__` class method defined here says that any class
Georg Brandl2d140982007-09-04 15:45:25 +0000112 that has an :meth:`__iter__` method in its :attr:`__dict__` (or in that of
Mark Summerfield08898b42007-09-05 08:43:04 +0000113 one of its base classes, accessed via the :attr:`__mro__` list) is
114 considered a ``MyIterable`` too.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000115
Georg Brandl2d140982007-09-04 15:45:25 +0000116 Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
Mark Summerfield08898b42007-09-05 08:43:04 +0000117 even though it does not define an :meth:`__iter__` method (it uses the
Georg Brandl2d140982007-09-04 15:45:25 +0000118 old-style iterable protocol, defined in terms of :meth:`__len__` and
119 :meth:`__getitem__`). Note that this will not make ``get_iterator``
120 available as a method of ``Foo``, so it is provided separately.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000121
122
123It also provides the following decorators:
124
Georg Brandl8a1caa22010-07-29 16:01:11 +0000125.. decorator:: abstractmethod(function)
Georg Brandlaeaa5462007-09-04 08:11:03 +0000126
127 A decorator indicating abstract methods.
128
Mark Summerfield08898b42007-09-05 08:43:04 +0000129 Using this decorator requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandl48310cd2009-01-03 21:18:54 +0000130 is derived from it.
Mark Summerfield08898b42007-09-05 08:43:04 +0000131 A class that has a metaclass derived from :class:`ABCMeta`
132 cannot be instantiated unless all of its abstract methods and
133 properties are overridden.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000134 The abstract methods can be called using any of the normal 'super' call
Georg Brandl2d140982007-09-04 15:45:25 +0000135 mechanisms.
136
137 Dynamically adding abstract methods to a class, or attempting to modify the
138 abstraction status of a method or class once it is created, are not
139 supported. The :func:`abstractmethod` only affects subclasses derived using
140 regular inheritance; "virtual subclasses" registered with the ABC's
141 :meth:`register` method are not affected.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000142
143 Usage::
144
145 class C(metaclass=ABCMeta):
146 @abstractmethod
147 def my_abstract_method(self, ...):
148 ...
149
Georg Brandl2d140982007-09-04 15:45:25 +0000150 .. note::
Georg Brandlaeaa5462007-09-04 08:11:03 +0000151
Benjamin Petersonad3d5c22009-02-26 03:38:59 +0000152 Unlike Java abstract methods, these abstract
Mark Summerfield08898b42007-09-05 08:43:04 +0000153 methods may have an implementation. This implementation can be
154 called via the :func:`super` mechanism from the class that
155 overrides it. This could be useful as an end-point for a
156 super-call in a framework that uses cooperative
157 multiple-inheritance.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000158
Georg Brandl2d140982007-09-04 15:45:25 +0000159
Georg Brandlb868a662009-04-02 02:56:10 +0000160.. function:: abstractproperty(fget=None, fset=None, fdel=None, doc=None)
Georg Brandl2d140982007-09-04 15:45:25 +0000161
162 A subclass of the built-in :func:`property`, indicating an abstract property.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000163
Mark Summerfield08898b42007-09-05 08:43:04 +0000164 Using this function requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandl48310cd2009-01-03 21:18:54 +0000165 is derived from it.
Mark Summerfield08898b42007-09-05 08:43:04 +0000166 A class that has a metaclass derived from :class:`ABCMeta` cannot be
167 instantiated unless all of its abstract methods and properties are overridden.
168 The abstract properties can be called using any of the normal
169 'super' call mechanisms.
Georg Brandlaeaa5462007-09-04 08:11:03 +0000170
171 Usage::
172
173 class C(metaclass=ABCMeta):
174 @abstractproperty
175 def my_abstract_property(self):
176 ...
177
178 This defines a read-only property; you can also define a read-write abstract
179 property using the 'long' form of property declaration::
180
181 class C(metaclass=ABCMeta):
182 def getx(self): ...
183 def setx(self, value): ...
184 x = abstractproperty(getx, setx)
185
Benjamin Petersond23f8222009-04-05 19:13:16 +0000186
Mark Summerfield08898b42007-09-05 08:43:04 +0000187.. rubric:: Footnotes
188
189.. [#] C++ programmers should note that Python's virtual base class
190 concept is not the same as C++'s.