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

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

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

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

Q&A

解決済

2回答

1077閲覧

Python classのイニタリゼイション内のself.とは

kazulztk

総合スコア14

Python

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

0グッド

0クリップ

投稿2020/05/07 13:30

python

1>>> class Complex: 2... def __init__(self, realpart, imagpart): 3... self.r = realpart #1 4... self.i = imagpart #2 5... 6>>> x = Complex(3.0, -4.5) 7>>> x.r, x.i 8(3.0, -4.5)

#1,#2はどのような処理をしているのでしょうか?

__init__の引数のrealpartとimagpartにself.r,self.iという名前を付けているという理解であっていますか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のように、辞書型変数に代入する処理は理解できますか?

python

1>>> x = {} 2>>> x['r'] = 3.0 3>>> x['l'] = -4.5 4>>> x 5{'r': 3.0, 'l': -4.5}

更に、関数を定義して値を代入する処理は理解できますか?

py

1>>> def init(self, realpart, imagpart): 2... self['r'] = realpart 3... self['l'] = imagpart 4... 5>>> x = {} 6>>> init(x, 3.0, -4.5) 7>>> x 8{'r': 3.0, 'l': -4.5}

クラスを定義してインスタンス生成すると、ドットと名前で値を代入できるようになります。

py

1>>> class Complex: 2... pass 3... 4>>> x = Complex() 5>>> x.r = 3.0 6>>> x.l = -4.5 7>>> vars(x) 8{'r': 3.0, 'l': -4.5}

関数で代入することもできます。

python

1>>> class Complex: 2... pass 3... 4>>> def init(self, realpart, imagpart): 5... self.r = realpart 6... self.l = imagpart 7... 8>>> x = Complex() 9>>> init(x, 3.0, -4.5) 10>>> vars(x) 11{'r': 3.0, 'l': -4.5}

init関数をクラスの中に書くこともできて、クラス名.関数名で呼び出すことができます。

python

1>>> class Complex: 2... def init(self, realpart, imagpart): 3... self.r = realpart 4... self.l = imagpart 5... 6>>> x = Complex() 7>>> Complex.init(x, 3.0, -4.5) 8>>> vars(x) 9{'r': 3.0, 'l': -4.5}

init関数を __init__という初期化メソッドにすることで、インスタンス生成と同時に代入できるようになります。self引数にはインスタンスが自動的に渡されます。

py

1>>> class Complex: 2... def __init__(self, realpart, imagpart): 3... self.r = realpart 4... self.l = imagpart 5... 6>>> x = Complex(3.0, -4.5) 7>>> vars(x) 8{'r': 3.0, 'l': -4.5}

処理順序を図にしてみました。

処理順序]

投稿2020/05/07 14:21

編集2020/05/08 10:42
shiracamus

総合スコア5406

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

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

kazulztk

2020/05/07 23:10

>>> class Complex: ... def __init__(self, realpart, imagpart): ... self.r = realpart  #1 ... self.l = imagpart #2 ... >>> x = Complex(3.0, -4.5) #3 >>> vars(x) {'r': 3.0, 'l': -4.5} #1,#2はinitの引数(self, realpart, imagpart)ということはわかりました では、self.r self.lとは何を指しているのですか? #3の3.0,-4.5という値が代入されているのでしょうか? もしそうならば、なぜ#1,#2のように書くのですか?
shiracamus

2020/05/08 00:30

Complex は虚数という意味です。 虚数は実数部と仮数部から成ります。 #3 で渡した 3.0 と -4.5 という値を、インスタンスselfの中の変数名 r に 実数部の値 3.0 を、変数名 l に虚数部の値 -4.5 を記憶しています。 なぜ変数名を r と l にしたのかは、作者に聞いてみないとわかりません。 なお、Pythonは標準でcomplex型があるので、Complexクラスを自作する必要はないんですけどね。 >>> value = 3.0-4.5j >>> value.real 3.0 >>> value.imag -4.5
kazulztk

2020/05/08 08:49

なぜ、realpartと imagpartに直接入れずにself.とするのでしょうか 何度もすみません
shiracamus

2020/05/08 11:35 編集

realpart と imagepart は __init__メソッドの引数です。realpartに3.0が、imagpartに-4.5が代入された状態で処理が始まります。 メソッドの処理が終わると、realpart引数および imagpart引数は破棄されて値が残りません。 self 引数には「インスタンス」というメモリ領域が渡されます。self.r と self.l に引数の値を代入して、初期化メソッド終了後にも値を使えるようにしています。 インスタンスは変数 x に代入されていますので、self と x は同一のインスタンスです。 self.r に代入した値は x.r で参照でき、self.l に代入した値は x.l で参照できます。
shiracamus

2020/05/08 10:44

クラス定義、クラスを呼び出してインスタンス生成と初期化する処理を図にして回答欄の最後に追記しました。 図をクリックすると拡大表示されます。 番号順に処理を追ってみてください。
kazulztk

2020/05/08 11:16

理解できました! 本当にありがとうございます
guest

0

initの引数のrealpartとimagpartにself.r,self.iという名前を付けているという理解であっていますか?

違います。

Pythonのインスタンスメソッドは呼び出し時に第一引数にインスタンス自身が渡されるように変換されます。また、Pythonのオブジェクトは基本的には属性を動的に追加できます。その仕組みを使ってインスタンスの属性riにコンストラクタの引数として受け取った値を代入しています。

投稿2020/05/07 14:08

hayataka2049

総合スコア30935

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問