6

このコード:

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    def test():
        print('test')

if __name__ == '__main__':
    x = testclass(2,3)

収量:

Error:
TypeError:test() takes no argument(1 given)

パラメータなしでテスト関数を呼び出していますが、なぜパラメータを指定したとエラーが表示されるのですか?

4

3 に答える 3

10

メソッドをとして呼び出しますself.test()test(self)関数の定義で呼び出しがどのように「受信」されるかを知るために、それを精神的に翻訳する必要があります。ただし、の定義testは単純def test()であり、移動する場所がないため、self観察したエラーが発生します。

なぜそうなのですか?Pythonは、検索するオブジェクトが具体的に指定されている場合にのみ属性を検索できるためです(属性の検索には、メソッド呼び出しが含まれます)。したがって、メソッドが呼び出されたオブジェクトに依存する処理を実行するには、何らかの方法でそのオブジェクトを受け取る必要があります。それを受け取るためのメカニズムは、それが最初の引数になることです。

デコレータを使用して、test実際にはまったく必要ないPythonに伝えることができます。その場合、Pythonはメソッドが必要ないことを認識しているため、最初の引数として追加しようとはしません。したがって、次の定義のいずれかで問題が解決します。selfstaticmethodselftest

def test(self):
    print('test')

また:

@staticmethod
def test():
    print('test')

これは、オブジェクト(常にのように見えるsome_object.some_method(...))で呼び出されるメソッドにのみ関係することに注意してください。通常の関数呼び出し(のように見えるfunction(...))には「ドットの左側」がないselfため、がないため、自動的に渡されません。

于 2012-09-28T02:20:41.430 に答える
7

メソッドに渡しselfますtest

def test(self):
    print('test')

Pythonは、インスタンス化されたオブジェクトを最初のパラメーターとして参照するパラメーターを明示的に渡すため、これを行う必要があります。メソッドへの引数がない場合でも(指定されたエラーのため)、省略しないでください。

于 2012-09-28T02:01:12.633 に答える
2

Pythonは常にインスタンスをインスタンスメソッドの最初の引数として渡します。これは、引数の数に関するエラーメッセージが1つずれているように見える場合があることを意味します。

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    def test(self):          ## instance method
        print('test', self)

if __name__ == '__main__':
    x = testclass(2,3)

クラスまたはインスタンスにアクセスする必要がない場合は、以下に示すようにstaticmethodを使用できます。

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    @staticmethod
    def test():
        print('test')

if __name__ == '__main__':
    x = testclass(2,3)

にアクセスする必要classがあるが、インスタンスにはアクセスできない場合、classmethodも同様です。

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    @classmethod
    def test(cls):
        print('test', cls)

if __name__ == '__main__':
    x = testclass(2,3)
于 2012-09-28T02:18:27.330 に答える