在Python 3.4+中,我们可以做到
class Foo(abc.ABC):
...
或者我们可以做
class Foo(metaclass=abc.ABCMeta):
...
我应该注意两者之间有什么不同吗?
答案 0 :(得分:23)
abc.ABC
基本上只是metaclass=abc.ABCMeta
上的额外图层。即abc.ABC
隐含地为我们定义了元类。
(资料来源: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
唯一的区别是,在前一种情况下,您需要一个简单的继承,在后一种情况下,您需要指定元类。
来自What's new in Python 3.4(强调我的):
新课程
ABC
已将ABCMeta
作为其元类。使用ABC
作为基础 class与指定具有基本相同的效果metaclass=abc.ABCMeta
,但输入更简单,更易于阅读。
相关问题: Create abstract base classes by inheritance rather than a direct invocation of __metaclass__