TypeError:1つの必須の位置引数がありません: 'self'


217

私はpythonが初めてで、壁にぶつかりました。私はいくつかのチュートリアルに従いましたが、エラーを乗り越えることができません:

Traceback (most recent call last):
  File "C:\Users\Dom\Desktop\test\test.py", line 7, in <module>
    p = Pump.getPumps()
TypeError: getPumps() missing 1 required positional argument: 'self'

いくつかのチュートリアルを調べましたが、私のコードと何も変わらないようです。私が考えることができる唯一のことは、Python 3.3が異なる構文を必要とするということです。

主な要点:

# test script

from lib.pump import Pump

print ("THIS IS A TEST OF PYTHON") # this prints

p = Pump.getPumps()

print (p)

ポンプクラス:

import pymysql

class Pump:

    def __init__(self):
        print ("init") # never prints


    def getPumps(self):
                # Open database connection
                # some stuff here that never gets executed because of error

私が正しく理解すれば、「自己」はコンストラクタとメソッドに自動的に渡されます。ここで何が悪いのですか?

私はpython 3.3.2でWindows 8を使用しています

回答:


281

ここでクラスインスタンスをインスタンス化する必要があります。

使用する

p = Pump()
p.getPumps()

小さな例-

>>> class TestClass:
        def __init__(self):
            print("in init")
        def testFunc(self):
            print("in Test Func")


>>> testInstance = TestClass()
in init
>>> testInstance.testFunc()
in Test Func

1
以前にそれを試しましたが、 "()"がありませんでした。これはpython 3.xの新機能ですか?
DominicM 2013

1
@DominicM:いいえ、それはいつもそこにありました。
スクリットカラ2013

1
うん、私が従ったチュートリアルを振り返ってみると、私の脳はブラケットを黒く
塗りつぶしただけだろう

4
クラス名は大文字である必要があり、すなわち、「TestClassを」「はTestClassを」する必要があります
eggonlegs

1
ありがとう、クラスのインスタンス化で括弧の欠落が私の問題でした。あなたの例は非常に明確です。
ポールワトソン

57

最初に初期化する必要があります:

p = Pump().getPumps()

14
単純さはしばしば過小評価されています。
theeastcoastwest 2016年

14
これを行うと、pはメソッドgetPumps()と等しくなりますが、これを実行すると、pはPump()クラスの変数として「使用可能」になりません。これは、役に立たない変数を作成するだけなので、素晴らしき練習ではありません。唯一の目的がgetPumps関数の実行である場合、関数の変数を作成する代わりに、Pump()。getPumps()を実行するだけで機能します。
Ashmoreinc 2017年

7

私がここで見る他のどのソリューションよりも機能し、シンプルです:

Pump().getPumps()

これは、クラスインスタンスを再利用する必要がない場合に最適です。Python 3.7.3でテスト済み。


2

また、メソッド@staticmethodに注釈を付けるためにPyCharmのアドバイスを時期尚早に取ると、このエラーが発生する可能性があります。注釈を削除します。


1

Python の'self'キーワードは、c ++ / java / c#の'this'キーワードに類似しています。

Python 2では、コンパイラによって暗黙的に行われ(yes python does compilation internally)ます。Python 3 explicitlyでは、コンストラクターとメンバー関数でそれを言及する必要があるだけです。例:

 class Pump():
 //member variable
 account_holder
 balance_amount

   // constructor
   def __init__(self,ah,bal):
   |    self.account_holder = ah
   |    self.balance_amount = bal

   def getPumps(self):
   |    print("The details of your account are:"+self.account_number + self.balance_amount)

 //object = class(*passing values to constructor*)
 p = Pump("Tahir",12000)
 p.getPumps()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.