71

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

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)

どうしたの?

4

8 に答える 8

88

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

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

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

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

これを修正するには、4 つのパラメーターを受け取るように average メソッドの定義を変更する必要があります。最初のパラメーターはオブジェクト参照で、残りの 3 つのパラメーターは 3 つの数値用です。

于 2008-12-28T23:48:05.033 に答える
34

あなたの例から、静的メソッドを使用したいようです。

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 での静的メソッドの多用は、通常、悪臭の兆候であることに注意してください。本当に関数が必要な場合は、モジュール レベルで直接宣言してください。

于 2008-12-28T23:51:21.457 に答える
13

サンプルの変更を最小限に抑えるために、コードを次のように修正できます。

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()
于 2014-05-24T02:51:04.540 に答える
4

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

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
于 2008-12-29T03:23:37.220 に答える
1

オブジェクト指向プログラミングのいくつかの基礎にもう少し時間を費やす必要があります。

これは厳しいように聞こえますが、重要です。

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

  • オブジェクトを作成するためのクラスの使用は完全に欠落しています。

  • 計算を行うためにクラスを使用することは不適切です。この種のことは可能ですが、それはの高度な概念を必要とし@staticmehodます。

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

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

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

クラス、オブジェクト、およびPythonのより良い紹介については、http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.htmlを参照することをお勧めします。

于 2008-12-29T01:46:17.323 に答える
1

クラスのPythonメンバー関数では、明示的なself引数が必要です。thisC++の暗黙のポインターと同じです。詳しくはこちらのページをご覧ください

于 2008-12-28T23:50:42.953 に答える
-2

インスタンスを作成したことがありません。

インスタンス メソッドとして average を定義したので、average を使用するには、最初にインスタンスを作成する必要があります。

于 2008-12-29T00:03:20.433 に答える