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

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

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

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

Q&A

解決済

1回答

443閲覧

コードを書く上で、__init__を使った場合と、使わない場合の使い分けなどありますか?

okahijiki

総合スコア404

Python 3.x

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

0グッド

0クリップ

投稿2023/01/21 06:40

以下の2つのクラス(Test,Test2)の使い方の違いがよく分かりません。

前者のTestでは、クラスからインスタンスを作成することは認識しているのですが、結局、TestとTest2のアウトプットは同じ値になります。

もっとも、後者のClass2はPythonの記述方法として、間違っているような気がしなくもないのですが...コードを書くに当たって、なにか両者の使い分け方があったりするのでしょうか。

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

python

1class Test: 2 def __init__(self,a): 3 self.a=a 4 5 def test(self): 6 return self.a+1 7 8b=Test(3) 9b.test() 10 11#4 12 13 14class Test2: 15 def test2(c): 16 return c+1 17 18d=Test2 19d.test2(3) 20 21#4

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

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

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

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

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

guest

回答1

0

ベストアンサー

pythonのオブジェクト(多くはクラスのインスタンス)は、値とメソッドを持つことができます。
メソッドは基本的にはクラスで定義されます。 値は基本的にメソッドから追加することができます。
__init__メソッドは、クラスのインスタンスが生成された直後に呼び出されるものなので、オブジェクトの生成時に値を設定したいときに使われます。

質問のTestクラスは、インスタンスに値を持っていますが、Test2クラスには値が無いというのが違いです。
なので、Testクラスのtestメソッドは3を与えずに計算することができますが、Test2クラスではtestメソッドに3を与えないこ計算ができません。
ただ、これくらいの内容のクラスであれば、どちらでもあまり変らないかもしれません。

複雑であったり、大量であったりするデータがあって、そのデータに対していろいろ複雑な処理をしなければならない場合、そのデータとそれを処理するメソッドを1つのクラスに定義して1つのものとして扱えるようにすると、その機能を使いたいだけの場合に便利です。
たとえば、PillowというモジュールはImageというクラスを提供していて、画像のデータを保持してそのデータを操作するさまざまなメソッドを持っています。

投稿2023/01/21 07:04

TakaiY

総合スコア12745

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

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

okahijiki

2023/01/21 07:36

TakaYさま ご回答ありがとうございますー。 「オブジェクト生成時に値を与えるか、オブジェクト生成後、メソッドに値を与えるかの違い」というふうに解釈しました。 使い方については、 class Test: def __init__(self,a): self.a=a def test(self): return self.a+1 b=Test(3) b.test() #4 e=Test(4) e.test() #5 class Test2: def test2(c): return c+1 d=Test2 d.test2(3) #4 f=Test2 f .test2(5) #6 というふうに、手間は変わらないような気がしなくもないのですが、でも、前者の方が何となくスッキリした感じであります〜。
TakaiY

2023/01/21 07:55

難しいなぁ。 まったく違うことをしているのに、結果が同じになるからといって、どちらでもいいというような話になっているように思います。 回答にも書きましたが、 Test と Test2 ではクラスのインスタンスが値を持っているかどうかという決定的な違いがありますし、そもそも Test.testメソッドど、 Test2.test2メソッドはまったく違うものなので、比較するのは間違えています。 たとえば、以下のように、オブジェクトdを変えなくても、test2メソッドの引数を変えるだけで結果が異なります。Test.testメソッドには引数が無いのでそのようなことは起きません。 d=Test2 d.test2(3) #4 d.test2(5) # 6
okahijiki

2023/01/21 09:09

ご回答ありがとうございます。すみません、違いがよくつかめていません。鋭意、勉強してまいりますー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問