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

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

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

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

Q&A

1回答

1076閲覧

インスタンス化の初期化メソッドについての理解が正しいか確認させてほしい

mannah

総合スコア5

Python

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

0グッド

0クリップ

投稿2020/08/15 13:45

編集2020/08/16 06:42

現在、python の インスタンス化について勉強しています。
現在下記動画の1:02:01のところの理解で躓いているので、教えてください。
(リンク参照リンク内容)

下記のコードを書いたところでストップしています。

#メソッド定義 class Student : def avg(self, math, english): print((math + english)/2) --★a001 をインスタンス化 a001 = Student() a001.name = "sato" a001.avg(30,70) print(a001.name) --★a002 のインスタンス化 a002 = Student()

ここから質問です

(1)
この時、a002 = Student()については、a001.name = "sato"のように
アトリビュートを作成していないため、エラーとなる認識です。

この場合、このままだと毎回色々なインスタンスを複数作成する度に アトリビュートを作成する必要がある(例: a002 = "Takeshi" など)ため、
この手間を防ぐため、動画の1:01:55 のところで説明されている通り、下記のような初期化メソッドを作成しておく必要がある認識なのですが、理解正しいでしょうか。

def __init__(self): self.name = ""

(2)
1:03:00 の部分で、「self に インスタンスが代入される」との説明があるのですが、意味が分かりません。インスタンスが代入されるとはどういう意味でしょうか。

(3)
1:03:04 の部分で、「引数 self に a001 が代入され、 a001.name となるイメージ」との説明がありますが、引数を受け取る場合は init(self,a) などself + 引数の書き方をするのではないでしょうか。
a001のインスタンス化をしている部分でも、
a001 = Student()
としか書いていないので、そもそもa001 を引数として渡していないように見えます。

(4)
そもそもの話ですが、何故、クラス化が必要なのかが理解できません。
def で関数を作成して、利用したいときに毎回 作成した関数を呼び出して利用するじゃダメなのでしょうか。

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

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

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

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

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

meg_

2020/08/15 14:16

・リンクは「リンクの挿入」で記入してください。 ・コードは「コードの挿入」で記入してください。
y_waiwai

2020/08/15 14:28

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
mannah

2020/08/16 06:42

megさま waiwai さま 大変失礼しました。コードを記載しなおしました。
guest

回答1

0

(1) 理解はほぼ正しいと思います。

(2) 動画の最初の方にあった「代入」の説明が不十分だから意味が分からなくなるのです。

代入は「変数名 = 値」という形式ですが、
「値」はインスタンス(オブジェクト) です。
「変数」は「箱」と説明していますが、その箱にインスタンスは入りません。
箱にはインスタンスへの参照値が入るのです。
参照値はインスタンスがメモリ中のどこにあるのかが分かる値です。
変数はインスタンスを参照します。

「a = 123」という代入式を評価すると、
{型:int, 値:123} というインスタンスがメモリ中のどこかにあって、
変数 a はそのインスタンスを参照するだけです。
インスタンスに a という名前を付けたと解釈しましょう。

「a = "abc"」という代入式を評価すると、
{型:str, 値:'abc'} というインスタンスがメモリ中のどこかにあって、
変数 a はそのインスタンスを参照するだけです。
a が以前に参照していた {型:int, 値:123} というインスタンスは
参照されなくなったのでシステムのメモリ管理(ガベージコレクション)に
よってメモリから削除されるかもしれません。

「a001 = Student()」では Student() でインスタンスが生成され
そのインスタンスに a001 という名前が付きました。
そのインスタンスは {型:Student, メソッド:avg} です。
「a001.name = "sato"」で Studentクラスのインスタンスは、
{型:Student, メソッド:avg, アトリビュート:name} になりました。
name は {型:str, 値:'sato'} というインスタンスを参照しています。

(3)
「a001.avg(30,70)」を実行すると、
self = a001
math = 30
english = 70
としてから、「print((math + english)/2) が実行されます。
self には a001 の参照値がコピーされるだけで、
a001 が参照していたインスタンスそのものがコピーされるのではありません。
Student() で作ったインスタンスは一つのままです。
self も a001 もその一つのインスタンスを参照しているのです。

追記
ちょっと訂正します。
Student() で作ったインスタンスは {型:Student} です。
メソッドもアトリビュートもありません。
メソッドを持っているのは Student です。
Student は {型:class, メソッド:avg} を参照していると考えましょう。

Student() で作ったインスタンスは、アトリビュート name を追加すると、
{型:Student, アトリビュート:name} となります。

追記
参照されなくなったインスタンス(オブジェクト)がメモリから削除されるという
説明を追加しました。

質問に対して回答しているのだから、何かコメントをお願いします。
理解できたのかできなかったのか、あるいは説明が長いので読んでいないなど
何でも構いません。

投稿2020/08/16 00:34

編集2020/08/17 03:00
kazuma-s

総合スコア8224

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

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

mannah

2020/08/18 12:50

すみません、他のソースコードを確認しながら、 現在いただいた回答文を理解しようとしています。 (2) と (3) が一度読んだだけだと理解できておらず、現在もソース確認しながら読んでいます。 (結局 self の中身がどうなっているかがわかっていません。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問