2016-08-19 23 views
0

承接了多項互聯網上的教程中,我創建這個例子:爲什麼我可以在不重寫所有抽象方法的情況下實例化派生自抽象類的類?

from abc import ABCMeta, abstractmethod 

class Base(object): 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def Foo(self): 
     print('Foo base') 

    @abstractmethod 
    def Bar(self): 
     print('Bar base') 

class Sub(Base): 

    def Foo(self): 
     print('Foo sub') 

    # no sub implementation of Bar 

s = Sub() # why does this work? 
s.Foo() # prints "Foo sub" 
s.Bar() # prints "Bar base" (which makes sense if it's 
     # **not** inheriting from an abstract class) 

這是我的理解是,你需要當你從一個包含抽象方法的類繼承重寫所有抽象方法。爲什麼這個工作?

回答

0

tl; dr:問題在於,您對抽象類使用Python 2語法,但在Python 3環境中執行。將您的基類聲明更改爲class Base(metaclass=ABCMeta):(Python 3聲明抽象類的方法)。現在,您將在實例化Base類和實例化Sub類時不會覆蓋所有抽象方法而獲得Type Error。


稍長的解釋 - 顯然這改變了Python 2和3之間,然而 Python的2.0版本是在Python 3仍然有效的代碼。它不是打破在代碼仍然執行(它只是運行一點....不同)的意義上的變化。你只是從基礎對象類繼承而來。您將不會收到任何警告或錯誤,顯然Python解釋器會放棄@abstractmethod註釋。

此外,在我已經能夠找到的任何「Python 2 vs Python 3」/「Python 2和3之間的差異」列表/文章中都沒有註明此更改。

相關問題