source: python/trunk/Doc/library/abc.rst

Last change on this file was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

  • Property svn:eol-style set to native
File size: 7.0 KB
RevLine 
[2]1: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
[391]12**Source code:** :source:`Lib/abc.py`
13
14--------------
15
16This 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
[2]18was added to Python. (See also :pep:`3141` and the :mod:`numbers` module
19regarding a type hierarchy for numbers based on ABCs.)
20
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
50 from abc import ABCMeta
51
52 class MyABC:
53 __metaclass__ = ABCMeta
54
55 MyABC.register(tuple)
56
57 assert issubclass(tuple, MyABC)
58 assert isinstance((), MyABC)
59
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,
[391]113 :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.
[2]117
118 The :meth:`__subclasshook__` class method defined here says that any class
[391]119 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.
[2]122
123 Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
[391]124 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
[2]126 :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
137 is derived from it.
138 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.
141 The abstract methods can be called using any of the normal 'super' call
142 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
160 Unlike Java abstract methods, these abstract
161 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
168.. function:: abstractproperty([fget[, fset[, fdel[, doc]]]])
169
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
173 is derived from it.
174 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
196
197.. rubric:: Footnotes
198
199.. [#] C++ programmers should note that Python's virtual base class
200 concept is not the same as C++'s.
Note: See TracBrowser for help on using the repository browser.