2009-12-30 33 views
5

據我所知,Python(2.5.2)沒有真正支持抽象類。爲什麼pylint抱怨這個類是「抽象類不參考?」它會爲任何有NotImplementedError的類拋出?是什麼讓pylint覺得我的課是抽象的?

我有自己的文件中的每個類,所以如果是這種情況,我想我別無選擇,只能壓制這條消息,但我希望有可能是另一種方式。

"""Package Repository interface.""" 


class PackageRepository(object): 
    """Package Repository interface.""" 

    def __init__(self): 
     self.hello = "world" 

    def get_package(self, package_id): 
     """ 
     Get a package by ID. 
     """ 
     raise NotImplementedError(\ 
       "get_package() method has not been implemented") 

    def get_packages(self): 
     """ 
     Get all packages. 
     """ 
     raise NotImplementedError(\ 
       "get_packages() method has not been implemented") 

    def commit(self): 
     """ 
     Commit all changes. 
     """ 
     raise NotImplementedError(\ 
       "commit() method has not been implemented") 

    def do_something(self): 
     """ 
     Doing something. 
     """ 
     return self.hello 

編輯

也許我應該澄清。我意識到這是一個抽象類,我喜歡使用abstract關鍵字,但據我所知,Python中沒有任何重要的東西(至少在我目前使用的版本中),所以我沒有打擾任何有趣的抽象技巧像那些found here),並簡單地將其排除在外。

我很驚訝地發現,pylint認爲這是一個抽象類的事實。是什麼讓pylint確定這是一個抽象類?它只是在尋找NotImplementedError被拋出某處嗎?

+6

是什麼讓你說它是**不是**抽象?它確實無法按原樣使用。它爲每個方法函數拋出異常。如果這不是一個例子,那麼「抽象」是什麼意思? – 2009-12-30 19:34:33

+0

令我感到困惑的是,Python不支持抽象類,但是如果在同一個文件中定義了但沒有被引用,pylint會投訴。 它讓我想知道如果我做了什麼錯誤觸發了這個警告。我更喜歡將我的類放在自己的文件中,所以我必然會經常遇到這種情況,並想知道是否有什麼我應該做更多的Pythonic,這將有助於我解決此警告。 – 2009-12-30 19:43:33

+1

@Beau Simensen:你爲什麼專注於每個文件一個類。這非常非Pythonic。事實上,這是你問題的根源。沒有人(尤其不是pylint)期望每個文件一個類。你爲什麼這樣做?請更新你的問題,並解釋你爲什麼這樣做。 – 2009-12-30 19:49:50

回答

1

根據我的經驗,pylint有點過分熱心,直到關閉了一些警告纔有用。

+0

您建議關閉哪些警告? – 2014-04-14 09:41:02

12

FWIW,raise NotImplementedError足以讓pylint認爲這是一個抽象類(這是絕對正確的)。來自logilab.org/card/pylintfeatures:W0223:方法%r在類%r中是抽象的,但未被覆蓋在抽象方法(即引發NotImplementedError)未在具體類中重寫時使用。 - 託比斯克2小時前

+0

提示@Tobiesque:發佈你的答案並獲得聲望。這樣我可以刪除這個答案,以支持你的。 – 2009-12-30 22:10:52

+0

這可能有點過分。我在'abc'模塊中使用好的東西來定義抽象類和方法,例如,我使用'NotImplementedError'來處理尚未實現的東西。 – 2017-10-25 15:54:10

相關問題