Is there any difference between using ABC vs ABCMeta?

PythonPython 3.x

Python Problem Overview


In Python 3.4+, we can do

class Foo(abc.ABC):
    ...

or we can do

class Foo(metaclass=abc.ABCMeta):
    ...

Are there any differences between the two that I should be aware of?

Python Solutions


Solution 1 - Python

abc.ABC basically just an extra layer over metaclass=abc.ABCMeta. i.e abc.ABC implicitly defines the metaclass for us.

(Source: https://hg.python.org/cpython/file/3.4/Lib/abc.py#l234)

class ABC(metaclass=ABCMeta):
    """Helper class that provides a standard way to create an ABC using
    inheritance.
    """
    pass

The only difference is that in the former case you need a simple inheritance and in the latter you need to specify the metaclass.

From What's new in Python 3.4(emphasis mine):

> New class ABC has ABCMeta as its meta class. Using ABC as a base > class has essentially the same effect as specifying > metaclass=abc.ABCMeta, but is simpler to type and easier to read.


Related issue: Create abstract base classes by inheritance rather than a direct invocation of __metaclass__

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwalrusView Question on Stackoverflow
Solution 1 - PythonAshwini ChaudharyView Answer on Stackoverflow