#はじめに
オブジェクト指向ってなによ?となる度に検索→一瞬の理解→忘れ→検索...を繰り返しているので、自分の中でイメージを作って記憶に残そう、と思って書いたメモです。
間違いなどあればご指摘いただけると大変助かります!
#オブジェクト指向とは?
Pythonはオブジェクト指向プログラミング言語と呼ばれる。つまり関数、変数など、プログラムが処理する全てのデータをオブジェクト=「物」として扱う言語。
#基本的な単語一覧
・オブジェクト... コンピュータ上に存在する何らかのデータ。
・クラス... オブジェクトを生成する際のデータやメソッド(=関数)を記述したもの。データの処理方法が書かれたレシピ。
・インスタンス... クラスによって実際に作られたオブジェクトのこと。(文字だけだといまいちイメージがつかみにくいので、下記のコード参照。)
・コンストラクタ... インスタンス生成時に実行される関数。
・メソッド... クラス内で定義される関数。
・メンバ... クラス内で定義される変数。
##オブジェクトの作り方
オブジェクトを作るには、何はともあれまずクラスの定義、つまりどうやってデータを扱うか?を決める必要がある。
#クラスの宣言
class Human:
def __init__(self,height,weight):
self.height = height
self.weight = weight
print("hello")
#インスタンス生成
human = Human()
#実行結果
hello
基本的なクラス定義の仕方は上記のようにclassの後にクラス名を指定し、def xxxでメソッドを記述する。
コンストラクタの第一引数の__self__
はインスタンス自身を指す。
__init__
で定義される関数はコンストラクタから呼び出される__初期化メソッド__。
なぜ「初期化」かというと、この中に書かれた処理内容はインスタンス生成時に自動で実行されるため。
つまり引数を指定することで、データの初期化を行っている。
#もうちょっと具体的な例
#インスタンス生成
human_data1 = Human(175, 60)
#インスタンスのメンバは(instance).(member)で参照できる
print(human_data1.height) #175
#メンバの書き換えも可能
human_data1.height = 180
print(human_data1.height) #180
##メソッド
上の例では初期化メソッドのみしか記述していないが、様々なメソッドを下記のように記述することができる。
class Human:
def __init__(self, height, weight, year):
self.height = height
self.weight = weight
self.year = year
def calculate_BMI(self):
bmi = self.weight / (self.height**2)
return bmi
def glow_old(self, after):
self.year += after
#インスタンス生成
human1_data = Human(175,60,25)
print(human1_data.calculate_BMI())
#glow_oldメソッドの呼び出し
human1_data.glow_old(5)
print(human1_data.year)
##クラスの継承
既存のクラスに機能を追加したいとき、クラスに直接上書きすることなくメソッドやメンバの追加が可能。
継承元となるクラスを「親クラス」、「基底クラス」、「スーパークラス」と呼び、継承先のクラスは「子クラス」、「サブクラス」、「派生クラス」と呼ばれる。
親の性質(=機能)をそのまま引き継いだ子供ができる感じ。(親にどんどん追加していくのではなく。)
class Human:
#コンストラクタ
def __init__(self, height, weight, year):
self.height = height
self.weight = weight
self.year = year
def calculate_BMI(self):
bmi = self.weight / (self.height**2)
return bmi
def glow_old(self, after):
self.year += after
#親クラスHumanを継承した子クラスHuman_detailed
class Human_detailed(Human):
def __init__(self, height, weight, year, blood_pressure, eyesight_right, eyesight_left):
#親クラスのコンストラクタの呼び出し
super().__init__(height, weight, year)
self.blood_pressure = blood_pressure
self.eyesight_right = eyesight_right
self.eyesight_left = eyesight_left
#インスタンス作成
human1_data_detailed = Human_detailed(175, 60, 25, 110, 1.0, 0.8)
#親クラスで定義した関数がつかえる!
print(human1_data_detailed.calculate_BMI())
#参考
https://xtech.nikkei.com/atcl/learning/lecture/19/00108/00005/