2009-11-22 91 views
2

我需要一些幫助來理解python概念。在這種情況下,抽象是什麼意思?

class TilePuzzleProblem(search.Problem): 
""" This class is the class for the NxN - blanks tile puzzle problem """ 

    def __init__(self, N, blanks, initial, goal): 
     """ Initialize """ 
     search.Problem.__init__(self, initial, goal) 
     self.N = N 
     self.blanks = blanks 

    def successor(self, state): 
     """ Generate the successors of the given state. Returns a list of (move, successor) pairs""" 
     abstract 

    def h(self, node): 
     abstract 

目前的代碼掛在功能h(...)abstract一部分,但我不知道是什麼abstract手段,因此無法理解的問題是什麼。

回答

9

這是描述爲here的技巧。 Python中沒有關鍵字abstract,因此,如果您不會在某個子類中重寫此方法,則會導致NotImplementedError

+2

'NameError',實際上。我認爲這個伎倆可能是我整個星期見過的最糟糕的主意。 –

+3

是的,可怕的做法。你應該自己在需要重寫的方法中自己提出'NotImplementedError'。 –

+0

這讓我很難過(編程)熊貓。 –

0

抽象意味着該類必須被繼承。抽象類或「基類」類提供了可以通過繼承擴展的基類型。你不能實例化一個抽象類,只能實例化繼承它的類。

查看this Wikipedia article瞭解更多信息。

你想要使用抽象基類的一個原因是如果你想分類或分組你的子類型。例如,Car,TruckPlane都將從Vehicle抽象基類繼承。你不能只是實例化一個「車輛」,你必須實例化一輛汽車,卡車或飛機。被抽象保護它不被實例化。

+0

感謝您的快速回答! 爲什麼有人會使用抽象類?我試圖理解它存在的原因...... – Leav

+0

......並且在OP的示例代碼中,'abstract'只是人們看它的一個標記,這裏缺少一些東西(真正的實現)。 – Dirk

+0

也可以有抽象函數嗎? – Leav

1

抽象函數是一個沒有實現的函數。它是一個佔位符,在那裏填寫類合同,以便知道子類應該提供什麼方法​​。你需要在這裏做的是創建一個TilePuzzleProblem的後裔,並填寫你自己的實現h。如果您想按原樣運行它,請創建一個後代,並使您的h無所事事。

5

抽象方法是一個類沒有實現的方法,使它成爲一個抽象類;子類必須覆蓋所有的抽象方法(即提供具體的實現)爲具體的類,也就是說你可以創建實例的類。 Python中用來表示「這種方法是抽象的」的正常方法是使方法的主體爲raise NotImplementedError

有關一般概念的更多信息,除了Python中的具體信息外,請參見wikipedia

因此,在形式上,您需要對此進行子類化並實現標記爲「抽象」的兩種方法。 (根據你的TA的提示,他或她實際上可能意味着你應該用一個工作的代碼體來替換「abstract」這個詞,但是這對於OOP中的「abstract」的正常含義是相當的延伸!) 。

相關問題