blob: 3a00a9c7cd5de6361dcf8ffc61e72206b29c372f [file] [log] [blame]
Georg Brandlafd05da2008-06-07 17:11:00 +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
10.. versionadded:: 2.6
11
Éric Araujo29a0b572011-08-19 02:14:03 +020012**Source code:** :source:`Lib/abc.py`
13
14--------------
15
Éric Araujo8fde9502011-07-29 11:34:17 +020016This module provides the infrastructure for defining :term:`abstract base
17classes <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this
Benjamin Petersonaac51b82008-07-01 23:33:06 +000018was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
19regarding a type hierarchy for numbers based on ABCs.)
Georg Brandlafd05da2008-06-07 17:11:00 +000020
21The :mod:`collections` module has some concrete classes that derive from
22ABCs; these can, of course, be further derived. In addition the
23:mod:`collections` module has some ABCs that can be used to test whether
24a class or instance provides a particular interface, for example, is it
25hashable or a mapping.
26
27
28This module provides the following class:
29
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
41 :func:`super`). [#]_
42
43 Classes created with a metaclass of :class:`ABCMeta` have the following method:
44
45 .. method:: register(subclass)
46
47 Register *subclass* as a "virtual subclass" of this ABC. For
48 example::
49
Georg Brandl7044b112009-01-03 21:04:55 +000050 from abc import ABCMeta
Georg Brandlafd05da2008-06-07 17:11:00 +000051
Georg Brandl7044b112009-01-03 21:04:55 +000052 class MyABC:
53 __metaclass__ = ABCMeta
Georg Brandlafd05da2008-06-07 17:11:00 +000054
Georg Brandl7044b112009-01-03 21:04:55 +000055 MyABC.register(tuple)
Georg Brandlafd05da2008-06-07 17:11:00 +000056
Georg Brandl7044b112009-01-03 21:04:55 +000057 assert issubclass(tuple, MyABC)
58 assert isinstance((), MyABC)
Georg Brandlafd05da2008-06-07 17:11:00 +000059
60 You can also override this method in an abstract base class:
61
62 .. method:: __subclasshook__(subclass)
63
64 (Must be defined as a class method.)
65
66 Check whether *subclass* is considered a subclass of this ABC. This means
67 that you can customize the behavior of ``issubclass`` further without the
68 need to call :meth:`register` on every class you want to consider a
69 subclass of the ABC. (This class method is called from the
70 :meth:`__subclasscheck__` method of the ABC.)
71
72 This method should return ``True``, ``False`` or ``NotImplemented``. If
73 it returns ``True``, the *subclass* is considered a subclass of this ABC.
74 If it returns ``False``, the *subclass* is not considered a subclass of
75 this ABC, even if it would normally be one. If it returns
76 ``NotImplemented``, the subclass check is continued with the usual
77 mechanism.
78
79 .. XXX explain the "usual mechanism"
80
81
82 For a demonstration of these concepts, look at this example ABC definition::
83
84 class Foo(object):
85 def __getitem__(self, index):
86 ...
87 def __len__(self):
88 ...
89 def get_iterator(self):
90 return iter(self)
91
92 class MyIterable:
93 __metaclass__ = ABCMeta
94
95 @abstractmethod
96 def __iter__(self):
97 while False:
98 yield None
99
100 def get_iterator(self):
101 return self.__iter__()
102
103 @classmethod
104 def __subclasshook__(cls, C):
105 if cls is MyIterable:
106 if any("__iter__" in B.__dict__ for B in C.__mro__):
107 return True
108 return NotImplemented
109
110 MyIterable.register(Foo)
111
112 The ABC ``MyIterable`` defines the standard iterable method,
Serhiy Storchakab33336f2013-10-13 23:09:00 +0300113 :meth:`~iterator.__iter__`, as an abstract method. The implementation given
114 here can still be called from subclasses. The :meth:`get_iterator` method
115 is also part of the ``MyIterable`` abstract base class, but it does not have
116 to be overridden in non-abstract derived classes.
Georg Brandlafd05da2008-06-07 17:11:00 +0000117
118 The :meth:`__subclasshook__` class method defined here says that any class
Serhiy Storchakab33336f2013-10-13 23:09:00 +0300119 that has an :meth:`~iterator.__iter__` method in its
120 :attr:`~object.__dict__` (or in that of one of its base classes, accessed
121 via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too.
Georg Brandlafd05da2008-06-07 17:11:00 +0000122
123 Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
Serhiy Storchakab33336f2013-10-13 23:09:00 +0300124 even though it does not define an :meth:`~iterator.__iter__` method (it uses
125 the old-style iterable protocol, defined in terms of :meth:`__len__` and
Georg Brandlafd05da2008-06-07 17:11:00 +0000126 :meth:`__getitem__`). Note that this will not make ``get_iterator``
127 available as a method of ``Foo``, so it is provided separately.
128
129
130It also provides the following decorators:
131
132.. function:: abstractmethod(function)
133
134 A decorator indicating abstract methods.
135
136 Using this decorator requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000137 is derived from it.
Georg Brandlafd05da2008-06-07 17:11:00 +0000138 A class that has a metaclass derived from :class:`ABCMeta`
139 cannot be instantiated unless all of its abstract methods and
140 properties are overridden.
Andrew M. Kuchlinga178a692009-04-03 21:45:29 +0000141 The abstract methods can be called using any of the normal 'super' call
Georg Brandlafd05da2008-06-07 17:11:00 +0000142 mechanisms.
143
144 Dynamically adding abstract methods to a class, or attempting to modify the
145 abstraction status of a method or class once it is created, are not
146 supported. The :func:`abstractmethod` only affects subclasses derived using
147 regular inheritance; "virtual subclasses" registered with the ABC's
148 :meth:`register` method are not affected.
149
150 Usage::
151
152 class C:
153 __metaclass__ = ABCMeta
154 @abstractmethod
155 def my_abstract_method(self, ...):
156 ...
157
158 .. note::
159
Georg Brandl89d4f0d2009-02-23 11:24:46 +0000160 Unlike Java abstract methods, these abstract
Georg Brandlafd05da2008-06-07 17:11:00 +0000161 methods may have an implementation. This implementation can be
162 called via the :func:`super` mechanism from the class that
163 overrides it. This could be useful as an end-point for a
164 super-call in a framework that uses cooperative
165 multiple-inheritance.
166
167
Georg Brandl21b60af2009-03-31 15:50:16 +0000168.. function:: abstractproperty([fget[, fset[, fdel[, doc]]]])
Georg Brandlafd05da2008-06-07 17:11:00 +0000169
170 A subclass of the built-in :func:`property`, indicating an abstract property.
171
172 Using this function requires that the class's metaclass is :class:`ABCMeta` or
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000173 is derived from it.
Georg Brandlafd05da2008-06-07 17:11:00 +0000174 A class that has a metaclass derived from :class:`ABCMeta` cannot be
175 instantiated unless all of its abstract methods and properties are overridden.
176 The abstract properties can be called using any of the normal
177 'super' call mechanisms.
178
179 Usage::
180
181 class C:
182 __metaclass__ = ABCMeta
183 @abstractproperty
184 def my_abstract_property(self):
185 ...
186
187 This defines a read-only property; you can also define a read-write abstract
188 property using the 'long' form of property declaration::
189
190 class C:
191 __metaclass__ = ABCMeta
192 def getx(self): ...
193 def setx(self, value): ...
194 x = abstractproperty(getx, setx)
195
Georg Brandl21b60af2009-03-31 15:50:16 +0000196
Georg Brandlafd05da2008-06-07 17:11:00 +0000197.. rubric:: Footnotes
198
199.. [#] C++ programmers should note that Python's virtual base class
200 concept is not the same as C++'s.