オブジェクト指向とPython

実行例は「saka.mokumoku」の「Google Colabotry」環境に保存してある

1.オブジェクト指向とは

 オブジェクトとは、
   データ(属性)とそれを操作する関数(メソッド)をカプセル化したもの
     猫という「オブジェクト:Object」は
       白くて尻尾があるという「属性:Property」
       手足が4本で歩くという「メソッド:Method」

2.クラス、インスタンス、オブジェクト

 オブジェクト指向では、クラスというものをプログラムとして記述しておく
   オブジェクトを使いたいときに、Pythonの文法を使って、
   クラスからオブジェクトを作り出す

   作ったオブジェクトのことを「インスタンス(実体:Instance)」と言う
     クラスからオブジェクトを作り出す操作のことを、
     「実体化する」とか「インスタンスを作る」と言う

 クラスとオブジェクトは、1対多の関係
   クラスを作成しておけば、オブジェクトを幾つでも作成できる

 猫の紹介文のテンプレートが「クラス」
   同じテンプレートに違う内容を記入することで、各猫の紹介文を作成する

 各猫が「インスタンス」で、
   猫の紹介文を作成することを「インスタンス化」という

3.インスタンスの初期化

# クラスの定義
class Neko:
  def __init__(self, breed, color, tail, neko_skill):
    self.breed = breed        # 猫種
    self.color = color # 毛の色
    self.tail = tail   # しっぽの有無
    self.neko_skill = neko_skill # ねこ技を設定

  # 属性に対して操作を行うメソッドの定義
  def hissatsu(self):
    print(f'{self.breed}の必殺技{self.neko_skill}!')

neko1 = Neko('マンチカン', '真っ白', '長い', 'ネコパンチ')
neko2 = Neko('スコティッシュフォールド', '三毛猫', 'ふさふさ', 'ネコキック')

# 属性の確認
print(neko1.color)
print(neko2.tail)

# メソッドの確認
neko1.hissatsu()
neko2.hissatsu()

 __init__() を使用する
   例として def __init__(self, breed, color, tail, neko_skill):

 インスタンスが作成された直後に、初期状態を設定する
   特有のデータ(属性)を割り当てる
     同じクラスの異なるインスタンスが異なる値を持つことができる

4.selfの使用

 特定のインスタンスの属性やメソッドにアクセスする
   例として self.breedはそのインスタンスの breed 属性を指す
   例として self を使ってメソッドを呼び出すことにより、
         そのインスタンスのコンテキスト内でメソッドが実行される
        メソッドがそのインスタンスのデータを操作できるようになる

5.クラスの継承、オーバーライド

class Koneko(Neko):
    def __init__(self, color, tail, name, neko_skill):
        super().__init__('マンチカン', color, tail, neko_skill)
        self.name = name

    # hissatsuメソッドをオーバーライド
    def hissatsu(self):
        print(f'{self.color}色の赤ちゃんマンチカンの必殺技{self.neko_skill}!')

    # 新しいメソッド(飼い主にごあいさつ)の追加
    def say_hello(self):
        print(f'はじめまして。ワタシの名前は{self.name}だにゃ。')

koneko = Koneko('オフホワイト', '短い', 'しろねこ', 'ねこじゃらし攻撃')

#
print(koneko.tail)
print(koneko.breed)

#
koneko.hissatsu()
koneko.say_hello()

 super().initを使用する
   親のクラスを呼び出して使用する

 クラスも継承ということを行うことができる
   継承元のクラスを親クラス、継承後のクラスを子クラスという

 クラスを継承することで、
   親クラスの特徴を持ちつつ子クラスに追加の属性を与えることができる
   メソッドを上書きしたり、追加することもできる

 継承・オーバーライドの際にも self が一役担う