3

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

abstract現在、関数の一部でコードがハングしているのですが、h(...)どういうabstract意味かわからないので、何が問題なのかわかりません。

4

4 に答える 4

11

これはここで説明するトリックです。Pythonにはキーワードがないabstractため、一部のサブクラスでこのメソッドをオーバーライドしないと、が発生しますNotImplementedError

于 2009-11-22T17:46:03.783 に答える
5

抽象メソッドは、クラスが実装しないメソッドであり、抽象クラスになります。サブクラスは、すべての抽象メソッドをオーバーライドして(つまり、具体的な実装を提供して)具体的なクラス、つまりインスタンスを作成できるクラスにする必要があります。Pythonで「このメソッドは抽象的です」を表現する通常の方法は、メソッドの本体を。にすることraise NotImplementedErrorです。

Pythonでの詳細以外の一般的な概念の詳細については、ウィキペディアを参照してください。

したがって、正式には、これをサブクラス化し、「abstract」とマークされた2つのメソッドを実装する必要があります。(TAのヒントによっては、実際には「abstract」という単語をコードの作業本体に置き換える必要があることを意味する場合がありますが、OOPでの「abstract」の通常の意味に関してはかなりの範囲になります!-) 。

于 2009-11-22T17:44:03.710 に答える
1

抽象関数は、実装されていない関数です。これはプレースホルダーであり、クラスコントラクトに記入するだけで、サブクラスが提供するメソッドを知ることができます。ここで行う必要があるのは、の子孫を作成しTilePuzzleProblem、の独自の実装を入力することですh。そのまま実行する場合は、子孫を作成しhて何もしないようにします。

于 2009-11-22T17:41:00.050 に答える
0

Abstractは、クラスを継承する必要があることを意味します。抽象クラスまたは「基本」クラスは、継承を通じて拡張できる基本タイプを提供するためにあります。抽象クラスをインスタンス化することはできず、それを継承するクラスのみをインスタンス化できます。

詳細については、このウィキペディアの記事を参照してください。

抽象基本クラスを使用する理由の1つは、サブタイプを分類またはグループ化する場合です。たとえば、、、CarおよびTruckはすべて抽象基本クラスPlaneから継承します。Vehicle「乗り物」をインスタンス化するだけでなく、車、トラック、または飛行機をインスタンス化する必要があります。抽象的であることは、インスタンス化されることからそれを保護します。

于 2009-11-22T17:39:18.260 に答える