2011-08-25 81 views
17

我已閱讀關於抽象基類python文檔:蟒@abstractmethod裝飾

here

abc.abstractmethod(function) 裝飾器指示的抽象方法。

使用裝飾器需要該類的元類是ABCMeta或 是從它派生的。除非其所有抽象方法和屬性都被覆蓋,否則無法實例化具有從ABCMeta 派生的元類的類。

而且here

您可以將@abstractmethod裝飾的方法,如抽獎() 必須實現的;然後,Python將提出一個例外, 類沒有定義方法。請注意,當您實際嘗試創建缺少該方法的子類 的實例時,引發的異常僅爲 。

我用這個代碼來測試出:

import abc 

class AbstractClass(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def abstractMethod(self): 
    return 

class ConcreteClass(AbstractClass): 
    def __init__(self): 
    self.me = "me" 

c = ConcreteClass() 
c.abstractMethod() 

的代碼都很好,所以我不明白這一點。如果我輸入c.abstractMethod我得到:

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>> 

我在這裏失蹤了什麼? ConcreteClass必須執行抽象方法,但我不會例外。

+2

哪一種Python?它報告錯誤對我來說很好。另外,你總是可以拋出NotImplementedError而不是使用'abc'。 –

+0

我發表了對mouad answer的評論,來自'python'的鏈接被設置爲默認爲'python3'。我會記住引發這個異常,因爲在python上寫入可移植代碼的方式似乎遠離我的Python知識。 – Sebastian

回答

25

您是否使用python3來運行該代碼?如果是的話,你應該知道,在Python 3 have changes聲明元類,你應該做這樣的代替:

import abc 

class AbstractClass(metaclass=abc.ABCMeta): 

    @abc.abstractmethod 
    def abstractMethod(self): 
     return 
+0

謝謝,這似乎是版本之間的巨大變化(我的發行版將'python'默認爲'python3')。如何編寫這個向後兼容?我猜這可能是另一個問題... – Sebastian

+1

@Sebastian:'python3'的設計與它的先例python2(http://www.python.org/dev/peps/pep-3000/#compatibility-and -transition),但要解決這兩個版本之間的向後不兼容問題,您應該使用2to3.py腳本(http://docs.python.org/library/2to3.html)。 – mouad

+0

不錯,我已經測試過了。我可以繼續使用'__metaclass__'語法並使用該腳本轉換爲'python3'語法。它只是做了你在這個例子中所陳述的。謝謝。 – Sebastian