質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

430閲覧

Pythonのクラスの理解を深めたい

minomushia

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/07/31 11:29

前提

Pythonのクラスの理解を深めたいのですが、つまづいてしまいました。

クラスを定義し、init(self,引数1,引数2・・・)、そして出力はなんとなく理解できたのですが、
クラス内にdef関数を複数作ったとき、どの関数にどのように引数を送ればいいのかわかりません。
ソースコードを貼らせていただきます。

y = Student.Keisan("10","20","30")
print(y.num1)

この書き方で何がおかしいのでしょうか?
どなたか教えてくださいますか。

よろしくお願いいたします。

実現したいこと

Pythonにおける、クラスの理解を深めたい

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/user/Documents/test.py", line 34, in <module> y = Student.Keisan("10","20","30") TypeError: Keisan() missing 1 required positional argument: 'num3'

該当のソースコード

Python

1class Student: 2 3 def __init__(self,name,age,number): 4 self.name = name 5 self.age = age 6 self.number = number 7 8 def Keisan(self, num1, num2, num3): 9 self.num1 = num1 10 self.num2 = num2 11 self.num3 = num3 12 13 14x = Student("John","27","100") 15y = Student.Keisan("10","20","30") 16 17print(x.name) 18print(y.num1) 19

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

通常、クラス内に記述したメソッド(関数)というのは、クラスのインスタンスを通して呼ばれることを前提に作ります。 言い換えると、インスタンスを作ってそのインスタンスから呼ぶものです。
なので、StudentクラスのKeisanメソッドを呼ぶには、

python

1x = Student("John","27","100") 2x.Keisan("10","20","30")

とするのが普通のやりかたです。 このxはStudentのインスタンスで、そのKeisanメソッドを呼ぶこことで、num1~3の数値が登録されます。

ここで注意すべきは、Keisanメソッド引数です。定義には引数が4つありますよね。そして、先頭にselfを書いていますよね。 ところが、このx.Keisan()の呼び出しには3つしか引数がありませんね。pythonは仕組みとして、インスタンスのメソッドを呼び出すとき、呼び出した時の引数の先頭にそのインスタンスそのものを追加して呼び出すようになっているのです。だから、メソッドの定義では、先頭にselfという引数を付けてそこにインスタンスが入っているという実装にするのです。

さて、実は、クラスに定義されている関数は、インスタンスが無くても呼び出すこともできます。この時はインスタンスでなく、クラス名で呼び出します。<クラス名>.<関数名>というように。
質問にある書き方はこれですね。
ところがこの呼び出し方のときは、インスタンスがありませんので、通常の関数と同じように、呼び出されたときの引数のみしか与えられません。 selfに割り当てる、暗黙のインスタンスが無いのです。
このように直接呼び出すことを意図して作られたクラス内のメソッドをスタティックメソッドと言います。
スタティックメソッドとして使うつもりで作るメソッドには、selfを想定しない定義にしなければなりません。

長々書きましたけど、結局は、インスタンスのメソッドとして呼ぶように定義された(=selfのある)メソッドをスタティックメソッド(=selfの無い)呼び方で呼んでいるからエラーになったということです。

が、呼び出し時には3つしか与えていません。

投稿2022/07/31 15:26

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minomushia

2022/07/31 22:47

わかりやすいご回答ありがとうございました。 調べると インスタンスメソッド クラスメソッド ステティックメソッド があるのですね...! 必要に応じて使い分けられるように頑張ります! ありがとうございました。
guest

0

コンストラクタとメソッドの区別が出来ていないようです。
質問者さんがやりたいことはおそらく下記かと思います。

Python

1x.Keisan("10","20","30") 2print(x.num1) 3> 10

Keisan()はクラスStudentのインスタンスから呼び出しましょう。
Student.Keisan(x,"10","20","30")とも書けますが、上記の使い方が一般的かと思います。

投稿2022/07/31 11:40

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minomushia

2022/07/31 22:47

ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問