17db96d56Sopenharmony_ci:mod:`abc` --- Abstract Base Classes 27db96d56Sopenharmony_ci==================================== 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: abc 57db96d56Sopenharmony_ci :synopsis: Abstract base classes according to :pep:`3119`. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci.. moduleauthor:: Guido van Rossum 87db96d56Sopenharmony_ci.. sectionauthor:: Georg Brandl 97db96d56Sopenharmony_ci.. much of the content adapted from docstrings 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci**Source code:** :source:`Lib/abc.py` 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci-------------- 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciThis module provides the infrastructure for defining :term:`abstract base 167db96d56Sopenharmony_ciclasses <abstract base class>` (ABCs) in Python, as outlined in :pep:`3119`; 177db96d56Sopenharmony_cisee the PEP for why this was added to Python. (See also :pep:`3141` and the 187db96d56Sopenharmony_ci:mod:`numbers` module regarding a type hierarchy for numbers based on ABCs.) 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciThe :mod:`collections` module has some concrete classes that derive from 217db96d56Sopenharmony_ciABCs; these can, of course, be further derived. In addition, the 227db96d56Sopenharmony_ci:mod:`collections.abc` submodule has some ABCs that can be used to test whether 237db96d56Sopenharmony_cia class or instance provides a particular interface, for example, if it is 247db96d56Sopenharmony_ci:term:`hashable` or if it is a mapping. 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciThis module provides the metaclass :class:`ABCMeta` for defining ABCs and 287db96d56Sopenharmony_cia helper class :class:`ABC` to alternatively define ABCs through inheritance: 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci.. class:: ABC 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci A helper class that has :class:`ABCMeta` as its metaclass. With this class, 337db96d56Sopenharmony_ci an abstract base class can be created by simply deriving from :class:`ABC` 347db96d56Sopenharmony_ci avoiding sometimes confusing metaclass usage, for example:: 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci from abc import ABC 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci class MyABC(ABC): 397db96d56Sopenharmony_ci pass 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci Note that the type of :class:`ABC` is still :class:`ABCMeta`, therefore 427db96d56Sopenharmony_ci inheriting from :class:`ABC` requires the usual precautions regarding 437db96d56Sopenharmony_ci metaclass usage, as multiple inheritance may lead to metaclass conflicts. 447db96d56Sopenharmony_ci One may also define an abstract base class by passing the metaclass 457db96d56Sopenharmony_ci keyword and using :class:`ABCMeta` directly, for example:: 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci from abc import ABCMeta 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci class MyABC(metaclass=ABCMeta): 507db96d56Sopenharmony_ci pass 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci .. versionadded:: 3.4 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci.. class:: ABCMeta 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci Metaclass for defining Abstract Base Classes (ABCs). 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci Use this metaclass to create an ABC. An ABC can be subclassed directly, and 607db96d56Sopenharmony_ci then acts as a mix-in class. You can also register unrelated concrete 617db96d56Sopenharmony_ci classes (even built-in classes) and unrelated ABCs as "virtual subclasses" -- 627db96d56Sopenharmony_ci these and their descendants will be considered subclasses of the registering 637db96d56Sopenharmony_ci ABC by the built-in :func:`issubclass` function, but the registering ABC 647db96d56Sopenharmony_ci won't show up in their MRO (Method Resolution Order) nor will method 657db96d56Sopenharmony_ci implementations defined by the registering ABC be callable (not even via 667db96d56Sopenharmony_ci :func:`super`). [#]_ 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci Classes created with a metaclass of :class:`ABCMeta` have the following method: 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci .. method:: register(subclass) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci Register *subclass* as a "virtual subclass" of this ABC. For 737db96d56Sopenharmony_ci example:: 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci from abc import ABC 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci class MyABC(ABC): 787db96d56Sopenharmony_ci pass 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci MyABC.register(tuple) 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci assert issubclass(tuple, MyABC) 837db96d56Sopenharmony_ci assert isinstance((), MyABC) 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci .. versionchanged:: 3.3 867db96d56Sopenharmony_ci Returns the registered subclass, to allow usage as a class decorator. 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci .. versionchanged:: 3.4 897db96d56Sopenharmony_ci To detect calls to :meth:`register`, you can use the 907db96d56Sopenharmony_ci :func:`get_cache_token` function. 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci You can also override this method in an abstract base class: 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci .. method:: __subclasshook__(subclass) 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci (Must be defined as a class method.) 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci Check whether *subclass* is considered a subclass of this ABC. This means 997db96d56Sopenharmony_ci that you can customize the behavior of ``issubclass`` further without the 1007db96d56Sopenharmony_ci need to call :meth:`register` on every class you want to consider a 1017db96d56Sopenharmony_ci subclass of the ABC. (This class method is called from the 1027db96d56Sopenharmony_ci :meth:`__subclasscheck__` method of the ABC.) 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci This method should return ``True``, ``False`` or ``NotImplemented``. If 1057db96d56Sopenharmony_ci it returns ``True``, the *subclass* is considered a subclass of this ABC. 1067db96d56Sopenharmony_ci If it returns ``False``, the *subclass* is not considered a subclass of 1077db96d56Sopenharmony_ci this ABC, even if it would normally be one. If it returns 1087db96d56Sopenharmony_ci ``NotImplemented``, the subclass check is continued with the usual 1097db96d56Sopenharmony_ci mechanism. 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci .. XXX explain the "usual mechanism" 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci For a demonstration of these concepts, look at this example ABC definition:: 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci class Foo: 1177db96d56Sopenharmony_ci def __getitem__(self, index): 1187db96d56Sopenharmony_ci ... 1197db96d56Sopenharmony_ci def __len__(self): 1207db96d56Sopenharmony_ci ... 1217db96d56Sopenharmony_ci def get_iterator(self): 1227db96d56Sopenharmony_ci return iter(self) 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci class MyIterable(ABC): 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci @abstractmethod 1277db96d56Sopenharmony_ci def __iter__(self): 1287db96d56Sopenharmony_ci while False: 1297db96d56Sopenharmony_ci yield None 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def get_iterator(self): 1327db96d56Sopenharmony_ci return self.__iter__() 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci @classmethod 1357db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1367db96d56Sopenharmony_ci if cls is MyIterable: 1377db96d56Sopenharmony_ci if any("__iter__" in B.__dict__ for B in C.__mro__): 1387db96d56Sopenharmony_ci return True 1397db96d56Sopenharmony_ci return NotImplemented 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci MyIterable.register(Foo) 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci The ABC ``MyIterable`` defines the standard iterable method, 1447db96d56Sopenharmony_ci :meth:`~iterator.__iter__`, as an abstract method. The implementation given 1457db96d56Sopenharmony_ci here can still be called from subclasses. The :meth:`get_iterator` method 1467db96d56Sopenharmony_ci is also part of the ``MyIterable`` abstract base class, but it does not have 1477db96d56Sopenharmony_ci to be overridden in non-abstract derived classes. 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci The :meth:`__subclasshook__` class method defined here says that any class 1507db96d56Sopenharmony_ci that has an :meth:`~iterator.__iter__` method in its 1517db96d56Sopenharmony_ci :attr:`~object.__dict__` (or in that of one of its base classes, accessed 1527db96d56Sopenharmony_ci via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, 1557db96d56Sopenharmony_ci even though it does not define an :meth:`~iterator.__iter__` method (it uses 1567db96d56Sopenharmony_ci the old-style iterable protocol, defined in terms of :meth:`__len__` and 1577db96d56Sopenharmony_ci :meth:`__getitem__`). Note that this will not make ``get_iterator`` 1587db96d56Sopenharmony_ci available as a method of ``Foo``, so it is provided separately. 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ciThe :mod:`abc` module also provides the following decorator: 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci.. decorator:: abstractmethod 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci A decorator indicating abstract methods. 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci Using this decorator requires that the class's metaclass is :class:`ABCMeta` 1707db96d56Sopenharmony_ci or is derived from it. A class that has a metaclass derived from 1717db96d56Sopenharmony_ci :class:`ABCMeta` cannot be instantiated unless all of its abstract methods 1727db96d56Sopenharmony_ci and properties are overridden. The abstract methods can be called using any 1737db96d56Sopenharmony_ci of the normal 'super' call mechanisms. :func:`abstractmethod` may be used 1747db96d56Sopenharmony_ci to declare abstract methods for properties and descriptors. 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci Dynamically adding abstract methods to a class, or attempting to modify the 1777db96d56Sopenharmony_ci abstraction status of a method or class once it is created, are only 1787db96d56Sopenharmony_ci supported using the :func:`update_abstractmethods` function. The 1797db96d56Sopenharmony_ci :func:`abstractmethod` only affects subclasses derived using regular 1807db96d56Sopenharmony_ci inheritance; "virtual subclasses" registered with the ABC's :meth:`register` 1817db96d56Sopenharmony_ci method are not affected. 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci When :func:`abstractmethod` is applied in combination with other method 1847db96d56Sopenharmony_ci descriptors, it should be applied as the innermost decorator, as shown in 1857db96d56Sopenharmony_ci the following usage examples:: 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci class C(ABC): 1887db96d56Sopenharmony_ci @abstractmethod 1897db96d56Sopenharmony_ci def my_abstract_method(self, arg1): 1907db96d56Sopenharmony_ci ... 1917db96d56Sopenharmony_ci @classmethod 1927db96d56Sopenharmony_ci @abstractmethod 1937db96d56Sopenharmony_ci def my_abstract_classmethod(cls, arg2): 1947db96d56Sopenharmony_ci ... 1957db96d56Sopenharmony_ci @staticmethod 1967db96d56Sopenharmony_ci @abstractmethod 1977db96d56Sopenharmony_ci def my_abstract_staticmethod(arg3): 1987db96d56Sopenharmony_ci ... 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci @property 2017db96d56Sopenharmony_ci @abstractmethod 2027db96d56Sopenharmony_ci def my_abstract_property(self): 2037db96d56Sopenharmony_ci ... 2047db96d56Sopenharmony_ci @my_abstract_property.setter 2057db96d56Sopenharmony_ci @abstractmethod 2067db96d56Sopenharmony_ci def my_abstract_property(self, val): 2077db96d56Sopenharmony_ci ... 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci @abstractmethod 2107db96d56Sopenharmony_ci def _get_x(self): 2117db96d56Sopenharmony_ci ... 2127db96d56Sopenharmony_ci @abstractmethod 2137db96d56Sopenharmony_ci def _set_x(self, val): 2147db96d56Sopenharmony_ci ... 2157db96d56Sopenharmony_ci x = property(_get_x, _set_x) 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci In order to correctly interoperate with the abstract base class machinery, 2187db96d56Sopenharmony_ci the descriptor must identify itself as abstract using 2197db96d56Sopenharmony_ci :attr:`__isabstractmethod__`. In general, this attribute should be ``True`` 2207db96d56Sopenharmony_ci if any of the methods used to compose the descriptor are abstract. For 2217db96d56Sopenharmony_ci example, Python's built-in :class:`property` does the equivalent of:: 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci class Descriptor: 2247db96d56Sopenharmony_ci ... 2257db96d56Sopenharmony_ci @property 2267db96d56Sopenharmony_ci def __isabstractmethod__(self): 2277db96d56Sopenharmony_ci return any(getattr(f, '__isabstractmethod__', False) for 2287db96d56Sopenharmony_ci f in (self._fget, self._fset, self._fdel)) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci .. note:: 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci Unlike Java abstract methods, these abstract 2337db96d56Sopenharmony_ci methods may have an implementation. This implementation can be 2347db96d56Sopenharmony_ci called via the :func:`super` mechanism from the class that 2357db96d56Sopenharmony_ci overrides it. This could be useful as an end-point for a 2367db96d56Sopenharmony_ci super-call in a framework that uses cooperative 2377db96d56Sopenharmony_ci multiple-inheritance. 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ciThe :mod:`abc` module also supports the following legacy decorators: 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci.. decorator:: abstractclassmethod 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci .. versionadded:: 3.2 2447db96d56Sopenharmony_ci .. deprecated:: 3.3 2457db96d56Sopenharmony_ci It is now possible to use :class:`classmethod` with 2467db96d56Sopenharmony_ci :func:`abstractmethod`, making this decorator redundant. 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci A subclass of the built-in :func:`classmethod`, indicating an abstract 2497db96d56Sopenharmony_ci classmethod. Otherwise it is similar to :func:`abstractmethod`. 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci This special case is deprecated, as the :func:`classmethod` decorator 2527db96d56Sopenharmony_ci is now correctly identified as abstract when applied to an abstract 2537db96d56Sopenharmony_ci method:: 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci class C(ABC): 2567db96d56Sopenharmony_ci @classmethod 2577db96d56Sopenharmony_ci @abstractmethod 2587db96d56Sopenharmony_ci def my_abstract_classmethod(cls, arg): 2597db96d56Sopenharmony_ci ... 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci.. decorator:: abstractstaticmethod 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci .. versionadded:: 3.2 2657db96d56Sopenharmony_ci .. deprecated:: 3.3 2667db96d56Sopenharmony_ci It is now possible to use :class:`staticmethod` with 2677db96d56Sopenharmony_ci :func:`abstractmethod`, making this decorator redundant. 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci A subclass of the built-in :func:`staticmethod`, indicating an abstract 2707db96d56Sopenharmony_ci staticmethod. Otherwise it is similar to :func:`abstractmethod`. 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci This special case is deprecated, as the :func:`staticmethod` decorator 2737db96d56Sopenharmony_ci is now correctly identified as abstract when applied to an abstract 2747db96d56Sopenharmony_ci method:: 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ci class C(ABC): 2777db96d56Sopenharmony_ci @staticmethod 2787db96d56Sopenharmony_ci @abstractmethod 2797db96d56Sopenharmony_ci def my_abstract_staticmethod(arg): 2807db96d56Sopenharmony_ci ... 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci.. decorator:: abstractproperty 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci .. deprecated:: 3.3 2867db96d56Sopenharmony_ci It is now possible to use :class:`property`, :meth:`property.getter`, 2877db96d56Sopenharmony_ci :meth:`property.setter` and :meth:`property.deleter` with 2887db96d56Sopenharmony_ci :func:`abstractmethod`, making this decorator redundant. 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci A subclass of the built-in :func:`property`, indicating an abstract 2917db96d56Sopenharmony_ci property. 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci This special case is deprecated, as the :func:`property` decorator 2947db96d56Sopenharmony_ci is now correctly identified as abstract when applied to an abstract 2957db96d56Sopenharmony_ci method:: 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci class C(ABC): 2987db96d56Sopenharmony_ci @property 2997db96d56Sopenharmony_ci @abstractmethod 3007db96d56Sopenharmony_ci def my_abstract_property(self): 3017db96d56Sopenharmony_ci ... 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci The above example defines a read-only property; you can also define a 3047db96d56Sopenharmony_ci read-write abstract property by appropriately marking one or more of the 3057db96d56Sopenharmony_ci underlying methods as abstract:: 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci class C(ABC): 3087db96d56Sopenharmony_ci @property 3097db96d56Sopenharmony_ci def x(self): 3107db96d56Sopenharmony_ci ... 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci @x.setter 3137db96d56Sopenharmony_ci @abstractmethod 3147db96d56Sopenharmony_ci def x(self, val): 3157db96d56Sopenharmony_ci ... 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci If only some components are abstract, only those components need to be 3187db96d56Sopenharmony_ci updated to create a concrete property in a subclass:: 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci class D(C): 3217db96d56Sopenharmony_ci @C.x.setter 3227db96d56Sopenharmony_ci def x(self, val): 3237db96d56Sopenharmony_ci ... 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ciThe :mod:`abc` module also provides the following functions: 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci.. function:: get_cache_token() 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci Returns the current abstract base class cache token. 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci The token is an opaque object (that supports equality testing) identifying 3337db96d56Sopenharmony_ci the current version of the abstract base class cache for virtual subclasses. 3347db96d56Sopenharmony_ci The token changes with every call to :meth:`ABCMeta.register` on any ABC. 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci .. versionadded:: 3.4 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci.. function:: update_abstractmethods(cls) 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci A function to recalculate an abstract class's abstraction status. This 3417db96d56Sopenharmony_ci function should be called if a class's abstract methods have been 3427db96d56Sopenharmony_ci implemented or changed after it was created. Usually, this function should 3437db96d56Sopenharmony_ci be called from within a class decorator. 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci Returns *cls*, to allow usage as a class decorator. 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci If *cls* is not an instance of :class:`ABCMeta`, does nothing. 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci .. note:: 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci This function assumes that *cls*'s superclasses are already updated. 3527db96d56Sopenharmony_ci It does not update any subclasses. 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci .. versionadded:: 3.10 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ci.. rubric:: Footnotes 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci.. [#] C++ programmers should note that Python's virtual base class 3597db96d56Sopenharmony_ci concept is not the same as C++'s. 360