イラストでわかる!Python のオブジェクト指向

【Python 入門】 イラストでわかる! Python のオブジェクト指向

みなさんこんにちは!キカガク講師の山川です。

今回は、Python を使い始めた方なら必ず気になるであろう、Python のオブジェクト指向についてお話ししていきます。オブジェクト指向については理解していなくともコードを書くことはできますが、やはり仕組みを知っておくに越したことはないのでは!ぜひこの記事で、オブジェクト指向について理解を深めていただけますと幸いです。

しろねこ
しろねこ

それではスタート!

オブジェクト指向とは

そもそもオブジェクトって何?

オブジェクトとは、データ(属性)とそれを操作する関数(メソッド)をカプセル化したものです。

例えば、ネコというオブジェクトで考えてみます。ネコにも毛の色・猫種・しっぽの長さなどのプロフィールがあります。このようにネコが持つ特徴を「属性」といいます。そして、そのネコには二足歩行やネコパンチといった必殺技があるとしましょう。このようにネコが取ることのできるアクションを「メソッド」といいます。

ネコによってプロフィール(属性)と必殺技(メソッド)は異なりますよね。それと同じで、プログラミングにおけるオブジェクトとは、独自の属性とメソッドを持ち、プログラム内で独立して動作するものと考えてください。

Pythonでのオブジェクト指向の基本

クラスの定義とインスタンスの生成

オブジェクト指向を理解する上で欠かせないキーワードが「クラス」「インスタンス」です。

みなさんがネコを飼いたいと思ってペットショップに行ったと想像してみてください。それぞれのネコには種・毛の色などが書かれた紹介文がありますよね。あの紹介文のテンプレートが「クラス」に相当します。

ペットショップの店員さんが同じテンプレートに違う内容を記入することで、それぞれのネコ用の紹介文が作成されています。ここではそれぞれのネコが「インスタンス」で、紹介文を作成することを「インスタンス化」といいます。

あれ、オブジェクトは何だったっけ・・

ペットショップにはたくさんのネコがいますが、そのネコ 1 匹 1 匹が「インスタンス」で、ペットショップのネコ全体の総称が「オブジェクト」という関係性になります。

属性とメソッドの利用

同じテンプレートに対して、記入する内容を変更すれば異なるネコの紹介文が完成します。

それぞれ特有の「属性」「メソッド」を持つネコを 2 匹生み出してみましょう。テンプレートを用意しそれぞれのプロフィールを記入し、インスタンス化するごとに違う特徴を持つネコが生まれます。

Python では、クラスの中に属性やメソッドを記述していきます。

クラス
# クラスの定義
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}!')

ここまでで、ネコのプロフィールと必殺技を記入するためのテンプレートが用意できました。

このテンプレートをもとに具体的な特徴を持つネコを生み出したいのですが、その前に気になることはないでしょうか・・

いきなり登場した __init__ や self って何?

__ init __ () の役割

  1. インスタンスの初期化
    • インスタンスが作成された直後に、そのオブジェクトの初期状態を設定します。つまり、属性の初期化が行われています。
  2. 属性の設定
    • インスタンスに特有のデータ(属性)を割り当てます。これにより、同じクラスの異なるインスタンスが異なる値を持つことができます(例:毛の色、しっぽなど)。

self の使用理由

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

疑問点が解決できたところで、ネコ生成に戻ります。

ネコパンチを必殺技とするマンチカンと、ネコキックを必殺技とするスコティッシュフォールドを生み出してみます。ここでインスタンス化を行います。テンプレートを埋めていくイメージで、カッコ内に引数として、プロフィールや必殺技を記述をしていきます。

インスタンス化
neko1 = Neko('マンチカン', '真っ白', '長い', 'ネコパンチ')
neko2 = Neko('スコティッシュフォールド', '三毛猫', 'ふさふさ', 'ネコキック')
ネコ 1 の毛の色の確認
neko1.color
ネコ 2 のしっぽの確認
neko2.tail

インスタンス化をすることで、引数として与えた特徴を持ったネコが生み出されます。neko1 と neko2 が両方生み出せているのは上述の init メソッドのおかげです。neko1 の情報を初期化(リセット)して新たに neko2 を生み出しているのです。

では、必殺技を出力してみましょう。

ネコ 1 のメソッドの呼び出し
neko1.hissatsu()
ネコ 2 のメソッドの呼び出し
neko2.hissatsu()

インスタンス(各ネコ)の名前に必殺技を定義した関数名をつけると、その関数で定義されたメソッドが実行されます。

クラスの継承とオーバーライド

親ネコからその特徴を受け継いだ子ネコが産まれるように、クラスも継承ということを行うことができます。継承元のクラスを親クラス、継承後のクラスを子クラスといいます。(ネコと同じですね。覚えやすい!)

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

継承・オーバーライドの際にも self が一役買っています。

継承とオーバーライド

  • 継承されたメソッドをオーバーライドする際に self を使用することで、サブクラスのインスタンスが親クラスのメソッドではなく、オーバーライドされた新しいメソッドを呼び出します。

では、真っ白なマンチカンの特徴を一部受け継いだ子ネコを生み出してみましょう。

クラスの継承
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}だにゃ。')

__ init __ 内で定義されているのが子クラス(子ネコ)の特徴です。ここでは親クラスにはなかった name という属性が追加されています。逆に、親クラスにあった breed は定義されていません。この場合は、breed は親クラスの属性をそのまま引き継いでいるということになります。

super().__init__() って何?

super() は親クラスのことを意味し、ここで親クラスの __ init __() メソッドを呼び出しています。つまり、ここでは親の情報にアクセスしていることになります。breed を ‘マンチカン’ と書いておくと、この親ネコから産まれる子ネコは全員マンチカンとすることができます。

hissatsu メソッドは受け継ぎつつ少し出力が変更されています。

say_hello メソッドは新しく追加されたメソッドで、飼い主にごあいさつをするというアクションが追加されます。

それではインスタンス化を行い子ネコを生み出してみましょう

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

クラスを継承してインスタンス化を行う場合は引数を子クラスと対応させることが必要です

子ネコのしっぽを確認
koneko.tail
子ネコの猫種を確認
koneko.breed

子ネコ特有の特徴を持ちつつ、親ネコの特徴も受け継いでいることが確認できました。

では、必殺技メソッドとごあいさつメソッドを実行してみましょう。

オーバーライドした hissatsu メソッドの呼び出し
koneko.hissatsu()
新規追加した say_hello メソッドの呼び出し
koneko.say_hello()

子ネコ特有の必殺技とごあいさつを実行することができました。

まとめ

オブジェクトとは属性メソッドをカプセル化したもの
・Python ではクラスの中に属性やメソッドを記述していく

オブジェクト指向について理解を深めていただけたら幸いです。今後コーディングの際にもぜひご参考にしてください。

しろねこ
しろねこ

ありがとうございました!

こちらの記事もオススメ

まずは無料で学びたい方・最速で学びたい方へ

まずは無料で学びたい方: Python&機械学習入門コースがおすすめ

Python&機械学習入門コース

AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!

無料で学ぶ

最速で学びたい方:キカガクの長期コースがおすすめ

一生学び放題

続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!

AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?

無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!

説明会ではこんなことをお話します!
  • 国も企業も育成に力を入れている先端 IT 人材とは
  • キカガクの研修実績
  • 長期コースでの学び方、できるようになること
  • 料金・給付金について
  • 質疑応答