1

Python 2.6 のこつをつかもうとしています。これは、プログラミング言語の入門書です。私は Learn Python the Hard Way に従っていますが、何かを見逃しているに違いありません。クラスに結合したい関数のセットがあります。これらの関数はここに含まれています。これらを「パーサー」と呼ばれるクラスにまとめようとしました。このコードはここに含まれています。

関数自体はクラスの外で動作します。私は次のようにクラスから関数を呼び出そうとしています:

モジュールをインポートします。

>>> from ex48 import parser2

クラスを割り当てます。

>>> parser_class = parser2.Parsers()

関数を呼び出します。

>>> parser_class.parse_subject(word_list, ('noun', 'player'))

私は以下を取得します:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex48/parser2.py", line 60, in parse_subject
    verb = parse_verb(word_list)
NameError: global name 'parse_verb' is not defined

なぜそれが私にそれを言っているのかわからない。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

3

コードが何をしているのか混乱しています。

これはクラスを割り当てず、インスタンスを作成し、そのインスタンスを変数に割り当てます。

parser_class = parser2.Parsers()

これにより、そのインスタンスのメソッドが呼び出されます。

parser_class.parse_subject(word_list, ('noun', 'player'))

以下は、グローバル関数 (または実際には任意の型の変数) がないことを示していますparse_verb

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex48/parser2.py", line 60, in parse_subject
    verb = parse_verb(word_list)
NameError: global name 'parse_verb' is not defined

これを に変更すると、同じオブジェクト ( )verb = self.parse_verb(word_list)のメソッドが呼び出されます。parse_verbself

于 2012-10-31T17:12:18.657 に答える
2

ここには 2 つの問題があります。1 つは機械的な問題、もう 1 つは概念的な問題です。後者を先に扱います。

クラスの要点は、そのインスタンスが世界のモデル内のある種のオブジェクトを表すことです。たとえば、「センテンス」はオブジェクトであるため、 というクラスを持つことは理にかなっていますSentenceが、「パーサー」はオブジェクトではないため、Parsersおそらく混乱したクラスになるでしょう。物事をあまり抽象的に見てみると、通常、クラスには何らかの状態があり、そのメソッドが動作するデータ メンバーにカプセル化されています。

ここに実際にあるのは、Sentenceオブジェクトを返す (または を発生させるParserError) パーサー関数です。この関数は のメソッドでSentenceある場合もあれば、フリー関数である場合もあります。そのようなオブジェクトがモデルに存在する何らかの理由がある場合、それはクラスのメソッドである可能性もありますParserが、存在しないようです。

これらすべてのヘルパー関数をカプセル化して、グローバル名前空間を散らかさないようにするだけの場合 (それ自体は良い考えです)、それを行うためにクラスを悪用する必要はありません。それらを 内でローカル関数にparse_sentenceするか、 というモジュールに入れますparsers

ここで、機械的な問題について説明します。クラスにメソッドがある場合、通常はドット構文でのみ呼び出します: someObject.methodName(params). メソッドが同じオブジェクトの別のメソッドを呼び出すときは、特別なselfパラメーター (各メソッドの最初のパラメーターとして正しくリストされている) を使用してそれを行います。そう:

verb = self.parse_verb(word_list)
obj = self.parse_object(word_list)

…サンプル内の他のすべてのメソッド呼び出しについても同様です。

すべての言語がselfこのような明示を必要とするわけではありません。たとえば、C++ または関連言語 (Java、C# など) では、メソッドはターゲットを指定せずに別のメソッドを呼び出すことができ、ターゲットはthis(C++ に相当するself) であると暗黙的に想定されます。

于 2012-10-31T17:31:56.580 に答える
1

Python インタラクティブ セッションで作業しているようです。

parser2.pyインポート後に に変更を加えたparser2場合は、

reload(parser2)

それらの変更を対話型インタープリターに知らせるため。

于 2012-10-31T17:08:57.400 に答える