2015-10-25 26 views
6

在Python 3.4+,我們可以做在Python 3.4+中,使用ABC與ABCMeta有什麼區別?

class Foo(abc.ABC): 
    ... 

,或者我們可以做

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

是否有兩個,我應該知道的有何區別?

+0

@海象 - 我相信,分歧並不陌生Python3.X。類創建實例並且元類創建類。當你調用Class時,它會爲該類使用隱式元類'type',但你不知道它。我認爲大多數情況下,你不需要使用元類,儘管我們在頭腦中得到的東西似乎總是通過使用元類來利用某些東西。 – inbinder

回答

6

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(重點煤礦):

新類ABCABCMeta其元類。使用ABC作爲基準 類基本上具有與指定 metaclass=abc.ABCMeta,相同的效果,但是類型更簡單並且易於閱讀


相關的問題:Create abstract base classes by inheritance rather than a direct invocation of __metaclass__

相關問題