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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3279閲覧

pythonのクラスの__init__やselfを理解したい

asasika

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/25 13:41

pythonのクラスの__init__やselfを理解したいと思っています

例えば

python3

1class Person: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 6taro=Person('太郎',17)

このようにinit関数は名前などの情報を登録するのに使えるのというのは知っています。

しかし、

python3

1class Integrate: 2 def __init__(self): 3 pygame.init() 4 screen=pygame.display.set_mode((1000,700)) 5 self.first_field() 6 while(True): 7 self.draw(screen) 8 self.key_handler() 9 pygame.display.update()

pygameでちょっとしたゲーム的な物を作ってるところの抜粋なのですが、このようにinitの後にselfだけを書いて下にselfとは関係ないコードが並んであったりしているのがわかりません。
自分の稚拙な考えだとinit関数は何か情報を登録するために使うものだと思っていましたので頭がこんがらがっています。

他のサイトを見ても「動作を覚えるといいです」や、「クラスの中でも特殊なものです」、「インスタンス化することができる関数です」など自分には納得できるものがありませんでした。

今知っている知識としては、
インスタンス化や、メソッドなどの用語は知っていますが、コンストラクタとinitの違いが分かっていない状態です(全く同じなのかもしれませんが)。
また、selfはその関数を指して、呼び出すときに呼び出しやすくさせる?的なことも知りました。

長くなりましたが、まとめるとinit関数にはインスタンス化によって情報の登録的なことをする関数だと自分は思っていますが、それ以外でinit関数が使われているのを見てとても気持ちが悪いと思いました。本質的にinit関数とは何なのか教えてほしいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

本質的にinit関数とは何なのか教えてほしいです。

__init__()はpyhtonの仕様上「インスタンスが作成された後、最初に呼び出されるメソッド」ですね。
インスタンス初期化子とも呼べます。

__init__の中にどういう処理を入れるかについて、質問者さんの仰る通り、「情報の登録
(属性の代入等)以外を入れるのはキモチワルイ」というのは、わからなくもありませんが、
インスタンスを生成した直後の「初期処理」の範囲内であれば、
プログラムの流れとして理にかなっている限り、情報の登録以外の処理を入れても特に問題はないものと思われます。

で、この「初期処理」というのは、プログラマやプログラムによってどこまで入れるか、匙加減は異なり千差万別なので、どういうやり方が絶対よい、このやり方は絶対悪いとは一概には言えないでしょう。
それこそこれだけで一冊本が書けそうです。

ただ、例にあるように、永遠に続きそうなwhileループを__init__の中に入れるのは、初期処理の範囲外っぽいのでどうかと思いますが。

なお厳密には__init__はインスタンスを生成したで呼ばれるものであり、インスタンスを生成するときに呼ばれるものではないため、一般的な他のプログラミング言語のコンストラクターとは少し異なります。

(狭義の)「コンストラクター」に該当するのは__new__になります。
(なお、__init__をコンストラクターというのは決して誤りではありません。同じ働きをするものなので。)
(通常__new__をコードで扱うことはあまりありません。singletonパターン(ここでは詳細は書きませんが)をつくるとき等、限られた場面で使われることはあります)

https://docs.python.org/3/reference/datamodel.html#object.init

Called after the instance has been created (by __new__()),

https://docs.python.org/3/reference/datamodel.html#object.new

Called to create a new instance of class

あと、Javaでは継承先で、継承元のコンストラクタを自動で呼んでくれますが、pythonは継承先で継承元の__init__は自動では呼ばれません。

これも__init__が他のコンストラクタとは異なっている特徴かもしれません。

class Superclass(object): def __init__(self): print('Do something') class Subclass(Superclass): def __init__(self): # super(Subclass, self).__init__() print('Do something else') Subclass() >>> Do something else # superの行がコメントアウトされているため、Subclassの__init__()しか実行されない。

おもしろいですね。

投稿2020/08/25 15:31

編集2020/08/25 16:04
sfdust

総合スコア1137

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

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

asasika

2020/08/26 11:41

丁寧な解答ありがとうございました。init関数とはインスタンスが生成された後に呼び出されるもので、その後少しの処理を入れ込んでいるというわけですね。そして、newという関数も初めて知りました。ありがとうございました。
guest

0

init関数は何か情報を登録するために使うものだと思っていましたので

これは間違っています。オブジェクトを生成する(インスタンス化)の時に呼ばれるメソッドです。

つまり、

コンストラクタとinitの違いが分かっていない状態です(全く同じなのかもしれませんが)。

__init__はコンストラクターです。

投稿2020/08/25 14:48

otn

総合スコア85901

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

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

asasika

2020/08/26 11:42

細かいところまで指摘ありがとうございます。
guest

0

Pythonのselfとかinitを理解する - Qiita

ここに説明があります

投稿2020/08/25 14:30

y_waiwai

総合スコア88042

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

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

asasika

2020/08/26 11:42

参考にさせていただきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問