0
class Parser():
        html_escape_table = {
            "&": "&",
            '"': """,
            "'": "'",
            ">": ">",
            "<": "&lt;",
            }
        def html_escape(text):
            return "".join(html_escape_table.get(c,c) for c in text)
        def query():
            database = [x, y, z, etc, etc2]
            for x in database:
                html_escape(x)
                print x #for testing purposes
                return
test = Parser()

test.query()

私はこれを正しく行っていますか?エラーが発生し続けます:

TypeError: query() takes no arguments (1 given)

クエリ、さらにはパーサーに引数を渡しているところはどこにも見当たりません。

誰かが私がここで間違っていることを説明できますか?

Parser.query()だけを呼び出してみたところ、このエラーが発生しました(これは、すべての関数にself引数を追加し、Parserクラスにobject引数を追加した後です)。

    Parser.query()
TypeError: unbound method query() must be called with Parser instance as first argument (got nothing instead)
4

5 に答える 5

7

selfクラスのメソッドには、Pythonがインスタンスメソッドを実行する方法でインスタンスをメソッドに解析するための引数が必要です。

例えば

class Test(object):
    def say_hello(self):
        print "Hi there"

まだ必要なインスタンスメソッドへの引数を解析したい場合は、これを拡張するだけですself

class Test(object):
    def say_hello(self, name):
        print "Hi %s" % name

編集:

さらに説明すると、Pythonがインスタンスを処理する方法を知っている必要があります。Pythonは非常に冗長で明確な方法でインスタンスを処理し、Javaselfの場合と同様に、常にそれ自体またはこの現在のインスタンスを参照するために使用さthisれます。したがって、Pythonがmy_instance.method()実際の呼び出しを呼び出す場合TheObject.method(my_instance)、なぜselfはmy_instanceメソッドの内部を参照するのでしょうか。これにより、メソッド内でインスタンスを使用し、インスタンス自体をarugments内で渡すことができます。

編集2:

メソッドへの引数として自分自身を持っている場合でも、そのようなインスタンスから呼び出す必要があります

my_parser = Parser()
my_parser.method()

編集3:

これはJavaではありません。クラス内のメソッドとして関数をバインドする必要はありません。parser.pyファイル内にフリーローミング関数として残しておくだけで、次のことができます。

import parser
parser.do_this()
于 2012-07-05T00:26:05.130 に答える
4

Pythonでは、クラスメソッドの最初のパラメータはself

class Parser(): # Creates a class that contain all of the functions that parse the mood based on tweets
    html_escape_table = {
            "&": "&amp;",
            '"': "&quot;",
            "'": "&apos;",
            ">": "&gt;",
            "<": "&lt;",
    }
    def html_escape(self, text):
        return "".join(html_escape_table.get(c,c) for c in text)
    def query(self):
        database = [x, y, z, etc, etc2]
        for x in database:
            html_escape(x)
            print x #for testing purposes
            return

test = Parser()

test.query()
于 2012-07-05T00:26:41.133 に答える
2

小さなことの1つ:Pythonでクラスを使い始める場合(少なくともPython 2.xでは、Python 3は異なります)、から継承する新しいスタイルのクラスを使用することをお勧めしますobject

Python 2.xクラス、新しいスタイル:

class MyClass(object):
    def __init__(self, args):
        # some code here

    # more methods here

古いスタイルのクラス(のないobject)は、Python2の現在のバージョンでは使用しないでください。

Python 3を使用している場合は、異なります。クラスはPython3でクリーンアップされた概念の1つであるため、継承する必要はありobjectません。したがって、Pythonでクラスを使用する方法を学習している場合は、取得する命令が正しいバージョン(主に2対3)のものであることを確認してください。

于 2012-07-05T00:30:10.017 に答える
2

オブジェクト指向言語では、メソッドは、呼び出されたオブジェクトにアクセスする方法を持っている必要があります。一部の言語では、これは暗黙的に行われます。selfPythonでは、メソッドは明示的な最初のパラメーターを使用して宣言する必要があります。

selfここで、パラメーター を持つようにコードを修正しました。

class Parser():
    """A class that contain all of the functions that parse the mood based on tweets."""
    html_escape_table = {
        "&": "&amp;",
        '"': "&quot;",
        "'": "&apos;",
        ">": "&gt;",
        "<": "&lt;",
        }
    def html_escape(self, text):
        return "".join(self.html_escape_table.get(c,c) for c in text)

    def query(self):
        database = [x, y, z, etc, etc2]
        for x in database:
            self.html_escape(x)
            print x #for testing purposes
            return

test = Parser()    
test.query()

のようなメソッドを呼び出すとtest.query()、そのqueryメソッドが呼び出さtestれ、パラメーターとして渡されselfます。また、メソッド内でオブジェクトを参照する場合は、selfパラメーターを使用して属性に明示的にアクセスする必要があります。

最後のポイント:query()メソッドでは、forループ内に戻るため、すべてを反復処理するのではなく、ループの1回の反復のみを実行しますdatabase

于 2012-07-05T00:53:48.533 に答える
1

ああ!

queryタイプのオブジェクト(と呼ばれるtest)を呼び出していますParser。内部的には、Pythonが行っていることは、を呼び出していParser.query(test)ます。

これが、クラス内にメソッドを作成するときに、常にself最初のパラメーターとして含める必要がある理由です。

他の人が言及しているように、関数のシグネチャを変更するdef query(self)と、この問題は解決します

お役に立てば幸い

于 2012-07-05T00:28:20.697 に答える