クラスの使用方法がわかりません。クラスを使用しようとすると、次のコードでエラーが発生します。
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)
どうしましたか?
変数を宣言し、クラスを関数であるかのように呼び出すことで、クラスをインスタンス化できます。
x = mystuff()
print x.average(9,18,27)
しかし、これはあなたが私たちに与えたコードでは動作しません。特定のオブジェクト(x)でクラスメソッドを呼び出すと、関数を呼び出すときに最初のパラメーターとして常にオブジェクトへのポインターが渡されます。そのため、今すぐコードを実行すると、次のエラーメッセージが表示されます。
TypeError: average() takes exactly 3 arguments (4 given)
これを修正するには、平均法の定義を変更して4つのパラメーターを取得する必要があります。最初のパラメーターはオブジェクト参照であり、残りの3つのパラメーターは3つの数値用です。
あなたの例から、静的メソッドを使用したいと思われます。
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で静的メソッドを頻繁に使用すると、通常は悪臭の症状になります。関数が本当に必要な場合は、モジュールレベルで直接宣言します。
サンプルを最小限に変更するには、コードを次のように修正します。
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()
クラス内のすべての関数、およびすべてのクラス変数は、指摘されているように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
これを試して:
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)
In pythonクラスのメンバー関数には、明示的なself
引数が必要です。C++の暗黙的なthis
ポインタと同じです。詳細については this ページ。
オブジェクト指向プログラミングの基本にもう少し時間をかける必要があります。
これは耳障りですが、重要です。
クラス定義が正しくありません-構文はたまたま受け入れられますが。定義は単に間違っています。
クラスを使用してオブジェクトを作成することはまったくありません。
クラスを使用して計算を行うことは不適切です。この種のことはできますが、@staticmehod
の高度な概念が必要です。
あなたのサンプルコードは非常に多くの点で間違っているので、きちんとした「これを修正する」答えを得ることができません。修正すべきものが多すぎます。
クラス定義のより良い例を見る必要があります。学習に使用しているソース資料は明確ではありませんが、読んでいる本は間違っているか不完全です。
使用している本や情報源をすべて破棄し、より良い本を見つけてください。真剣に。彼らは、クラス定義がどのように見え、どのように使用されるかについてあなたを誤解させてきました。
http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html をご覧になると、クラス、オブジェクト、Pythonのより良い紹介が得られます。