2017-06-15 85 views
2

關於abc的標準文檔以及我讀過的其他教程都使用了定義抽象基類而不從對象繼承的示例。如果python抽象基類繼承自對象

class Foo(object): 
    def __getitem__(self, index): 
     ... 
    def __len__(self): 
     ... 
    def get_iterator(self): 
     return iter(self) 

class MyIterable: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def __iter__(self): 
     while False: 
      yield None 

在過去,我總是讓我的類繼承對象有新風格的類。我應該和ABC一樣嗎?

回答

1

聲明的MyIterable元類是ABCMeta確保的MyIterable實例(或更適當地,的MyIterable子類,因爲它是一個抽象基類)將是「新」的風格。如果您要創建MyIterable的子類的實例(如下所示),它將表現爲新的樣式類。

class SubIterable(MyIterable): 
    def __iter__(self): 
     # your implementation here 
     ... 

>>> type(SubIterable()) 
<type '__main__'.MyIterable> 

如果MyIterable確實是一個 「老」 的風格類,type(SubIterable())將返回<type 'instance'>