web-dev-qa-db-ja.com

クラスメソッドを呼び出すと、Python

クラスの使用方法がわかりません。クラスを使用しようとすると、次のコードでエラーが発生します。

class MyStuff:
    def average(a, b, c): # Get the average of three numbers
        result = a + b + c
        result = result / 3
        return result

# Now use the function `average` from the `MyStuff` class
print(MyStuff.average(9, 18, 27))

エラー:

File "class.py", line 7, in <module>
    print(MyStuff.average(9, 18, 27))
TypeError: unbound method average() must be called with MyStuff instance as first argument (got int instance instead)

どうしましたか?

71
stu

変数を宣言し、クラスを関数であるかのように呼び出すことで、クラスをインスタンス化できます。

x = mystuff()
print x.average(9,18,27)

しかし、これはあなたが私たちに与えたコードでは動作しません。特定のオブジェクト(x)でクラスメソッドを呼び出すと、関数を呼び出すときに最初のパラメーターとして常にオブジェクトへのポインターが渡されます。そのため、今すぐコードを実行すると、次のエラーメッセージが表示されます。

TypeError: average() takes exactly 3 arguments (4 given)

これを修正するには、平均法の定義を変更して4つのパラメーターを取得する必要があります。最初のパラメーターはオブジェクト参照であり、残りの3つのパラメーターは3つの数値用です。

87
Ryan

あなたの例から、静的メソッドを使用したいと思われます。

class mystuff:
  @staticmethod
  def average(a,b,c): #get the average of three numbers
    result=a+b+c
    result=result/3
    return result

print mystuff.average(9,18,27)

pythonで静的メソッドを頻繁に使用すると、通常は悪臭の症状になります。関数が本当に必要な場合は、モジュールレベルで直接宣言します。

34
rob

サンプルを最小限に変更するには、コードを次のように修正します。

class myclass(object):
        def __init__(self): # this method creates the class object.
                pass

        def average(self,a,b,c): #get the average of three numbers
                result=a+b+c
                result=result/3
                return result


mystuff=myclass()  # by default the __init__ method is then called.      
print mystuff.average(a,b,c)

または、より完全に拡張し、他のメソッドを追加できるようにします。

class myclass(object):
        def __init__(self,a,b,c):
                self.a=a
                self.b=b
                self.c=c
        def average(self): #get the average of three numbers
                result=self.a+self.b+self.c
                result=result/3
                return result

a=9
b=18
c=27
mystuff=myclass(a, b, c)        
print mystuff.average()
13
cmoman

クラス内のすべての関数、およびすべてのクラス変数は、指摘されているようにself引数を取る必要があります。

class mystuff:
    def average(a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result
    def sum(self,a,b):
            return a+b


print mystuff.average(9,18,27) # should raise error
print mystuff.sum(18,27) # should be ok

クラス変数が関係する場合:

 class mystuff:
    def setVariables(self,a,b):
            self.x = a
            self.y = b
            return a+b
    def mult(self):
            return x * y  # This line will raise an error
    def sum(self):
            return self.x + self.y

 print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y
 print mystuff.mult() # should raise error
 print mystuff.sum()  # should be ok
4
lmount

これを試して:

class mystuff:
    def average(_,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)

またはこれ:

class mystuff:
    def average(self,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)
1
Rob123

In pythonクラスのメンバー関数には、明示的なself引数が必要です。C++の暗黙的なthisポインタと同じです。詳細については this ページ。

1
Suraj

オブジェクト指向プログラミングの基本にもう少し時間をかける必要があります。

これは耳障りですが、重要です。

  • クラス定義が正しくありません-構文はたまたま受け入れられますが。定義は単に間違っています。

  • クラスを使用してオブジェクトを作成することはまったくありません。

  • クラスを使用して計算を行うことは不適切です。この種のことはできますが、@staticmehodの高度な概念が必要です。

あなたのサンプルコードは非常に多くの点で間違っているので、きちんとした「これを修正する」答えを得ることができません。修正すべきものが多すぎます。

クラス定義のより良い例を見る必要があります。学習に使用しているソース資料は明確ではありませんが、読んでいる本は間違っているか不完全です。

使用している本や情報源をすべて破棄し、より良い本を見つけてください。真剣に。彼らは、クラス定義がどのように見え、どのように使用されるかについてあなたを誤解させてきました。

http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html をご覧になると、クラス、オブジェクト、Pythonのより良い紹介が得られます。

1
S.Lott