初めに。
どうもpython歴3か月の者です。
今回は一度学習して理解できずにスルーしていたクラスについてリベンジしたいと思います。
初回に学習した時より理解できたのでその忘備録やアウトプットに。
自分はクラスの理解に苦労したので、このような方に少しでも楽になればと。
次回記事できました。継承やオブジェクト指向について触れています。
- 出力結果表示の際にf文字列を使用しております。
今回扱う参照コード
このようなコードの理解を深めていきます。なんとなくニュアンスで分かるかもしれませんが、ある程度しっかり把握する事を目標と致します。
class Student: #クラスの定義
def __init__(self,name,math,english): #コンストラクタ(初期化)メソッド。
self.name = name #アトリビュートの設定
self.math = math #アトリビュートの設定
self.english = english #アトリビュートの設定
def avg(self): #avgメソッド
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
a001 = Student("sato",50,70) #インスタンスとアトリビュート(変数)の代入。クラス呼出(実行)
a002 = Student("tanaka",40,90)
a003 = Student("yamakawa",50,60)
print(f"{a001.avg()}\n{a002.avg()}\n{a003.avg()}")
print()
print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
print(f"{a002.name}の数学は{a002.math},英語は{a002.english}")
print(f"{a003.name}の数学は{a003.math},英語は{a003.english}")
出力結果
satoさんの平均点は60.0
tanakaさんの平均点は65.0
yamakawaさんの平均点は55.0
satoの数学は50,英語は70
tanakaの数学は40,英語は90
yamakawaの数学は50,英語は60
用語確認
最初に用語をある程度把握していると楽になるかと。初見で理解できなくても平気です。
なんとなくで。忘れた時にこのページに戻って頂ければ。
クラス
データと処理をまとめたもの。それぞれ別名があり、以降はそれで呼びます。
データ:アトリビュート 処理:メソッド
クラスにはアトリビュートとメソッドにて構成されております。
参照コードの場合はこの部分全体の事です。
class Student:
def __init__(self,name,math,english):
self.name = name
self.math = math
self.english = english
def avg(self):
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
アトリビュート
self.name = name
self.math = math
self.english = english
この部分でアトリビュート設定をしています。
メソッド
通常の関数との違いは第一引数の指定がある。という事です。selfの部分です。
関数では渡したい引数がない場合は空欄でも結構ですがクラスでは必ず第一引数が必要です。
その引数はなんでも良いのですが、慣習的にselfとなっています。
私もここのselfが良く分からずにクラス理解をリタイアしました。
具体例
def __init__(self,name,math,english):
self.name = name
self.math = math
self.english = english
def avg(self):
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
ここで疑問が湧いてきますよね。
-
強制的第一引数selfとは?その役割は?なんで必要なの?
ひとまずここは、こーゆーものだと覚えて頂ければ。
プログラミングを学ぶ上でシステムに対する割り切りの良さも重要な要素の一つです。(by学習歴3ケ月)
インスタンス化
人やサイトにより言い方が違うのは混乱しますよね。自分の流儀以外もストックに入れておきましょう。
先ほどのクラス、実はクラス単体では使用する事はできません。
クラスを使用できる状態に処置する動作が必要です。
これこそインスタンス化です。
他の説明としてよく
- クラスという設計図、たい焼きの型から、実際に使えるモノ(実体化、設計図から車、たい焼きの型からたい焼き)を作る.
という例も見ますよね。私は正直ピンと来ませんでした…。
具体例
参照コードでいうこの部分です。
a001 = Student("sato",50,70)
ひとまずこのようなコードで確認してください。
a001 = Student()
いかがでしょうか?これはクラス(Student)そのものを変数に格納しています。
この動作がインスタンス化といいます。
こうすることでクラスを使う事が出来ます。
もう一つ大事なポイントとして
- クラスを作成したその数だけ、アトリビュート(変数)も作成しなければなりません。
インスタンス毎にアトリビュートを定義する。⇒とても面倒です。
コンストラクタ
コンストラクタ:意味:初期化。新しいインスタンスを作成するごとにアトリビュート定義を自動的に行うメソッド。
参照コードもコンストラクタを設定しております。この部分です。(コメントも残しておきます。)
def __init__(self,name,math,english): #コンストラクタ(初期化)メソッド。
self.name = name #アトリビュートの設定
self.math = math #アトリビュートの設定
self.english = english #アトリビュートの設定
メソッドなので、第一引数にself
コンストラクタ=アトリビュート(変数)自動作成メソッド(関数)
ピンとこないと思うので、コンストラクタ無しの場合どうなるかコードにて紹介致します。
class Student: #クラスの定義
def avg(self): #avgメソッド
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
a001 = Student() #インスタンス化
a001.name = "tanaka" #アトリビュート作成
a001.math = 50 #アトリビュート作成
a001.english = 70 #アトリビュート作成
print(a001.avg())
print()
print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
面倒臭いのでtanakaさん一人のみです…。
この見慣れない__init__
というのは楽する為の自動装置。とひとまず考えて頂ければ。
コードの流れ
①赤⇒②黄緑⇒③青 と実行されていきます。
参照コード
class Student:
def __init__(self,name,math,english):
self.name = name
self.math = math
self.english = english
def avg(self):
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
a001 = Student("sato",50,70)
a002 = Student("tanaka",40,90)
a003 = Student("yamakawa",50,60)
print(f"{a001.avg()}\n{a002.avg()}\n{a003.avg()}")
print()
print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
print(f"{a002.name}の数学は{a002.math},英語は{a002.english}")
print(f"{a003.name}の数学は{a003.math},英語は{a003.english}")
クラスの特徴
クラスの利点を紹介致します。ズバリ
self.xxxx(変数名)に保存したデータを上書きせずに、保持する事が可能です。
print(a001.name) #⇒sato
print(a002.name) #⇒tanaka
print(a003.name) #⇒yamakawa
このようにname
という変数に複数のデータが格納されています。
通常変数というものは上書きされますよね。クラスの変数(アトリビュート)は違うのです。
このクラスの特徴を使いこなすことで、下記の部分実装時に、不要な引数なしに、保持している変数を使って処理を実行する事が可能です。
def avg(self):
return (self.name+"さんの平均点は"+ str((self.math + self.english)/2))
終わりに
いかがでしたか?
クラスの理解は難しいみたいです。いろんな方がおっしゃっていました。
私もまだまだクラスについて勉強途中なので随時更新していく予定です。
何か間違っている箇所等ありましたら教えて頂ければ幸いです。
次回記事はこちら。継承やオブジェクト指向について触れています。
参照