みなさんこんにちは!キカガク講師の山川です。
今回は、Python を使い始めた方なら必ず気になるであろう、Python のオブジェクト指向についてお話ししていきます。オブジェクト指向については理解していなくともコードを書くことはできますが、やはり仕組みを知っておくに越したことはないのでは!ぜひこの記事で、オブジェクト指向について理解を深めていただけますと幸いです。
それではスタート!
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。
オブジェクト指向とは
そもそもオブジェクトって何?
オブジェクトとは、データ(属性)とそれを操作する関数(メソッド)をカプセル化したものです。
例えば、ネコというオブジェクトで考えてみます。ネコにも毛の色・猫種・しっぽの長さなどのプロフィールがあります。このようにネコが持つ特徴を「属性」といいます。そして、そのネコには二足歩行やネコパンチといった必殺技があるとしましょう。このようにネコが取ることのできるアクションを「メソッド」といいます。
ネコによってプロフィール(属性)と必殺技(メソッド)は異なりますよね。それと同じで、プログラミングにおけるオブジェクトとは、独自の属性とメソッドを持ち、プログラム内で独立して動作するものと考えてください。
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 __ () の役割
- インスタンスの初期化:
- インスタンスが作成された直後に、そのオブジェクトの初期状態を設定します。つまり、属性の初期化が行われています。
- 属性の設定:
- インスタンスに特有のデータ(属性)を割り当てます。これにより、同じクラスの異なるインスタンスが異なる値を持つことができます(例:毛の色、しっぽなど)。
self
の使用理由
- インスタンス固有のデータへのアクセス:
self
を使用することで、その特定のインスタンスの属性やメソッドにアクセスできます。例えば、self.breed
はそのインスタンスのbreed
属性を指します。
- メソッドの呼び出し:
self
を使ってメソッドを呼び出すことにより、そのインスタンスのコンテキスト内でメソッドが実行されます。これにより、メソッドがそのインスタンスのデータを操作できるようになります。
疑問点が解決できたところで、ネコ生成に戻ります。
ネコパンチを必殺技とするマンチカンと、ネコキックを必殺技とするスコティッシュフォールドを生み出してみます。ここでインスタンス化を行います。テンプレートを埋めていくイメージで、カッコ内に引数として、プロフィールや必殺技を記述をしていきます。
neko1 = Neko('マンチカン', '真っ白', '長い', 'ネコパンチ')
neko2 = Neko('スコティッシュフォールド', '三毛猫', 'ふさふさ', 'ネコキック')
neko1.color
neko2.tail
インスタンス化をすることで、引数として与えた特徴を持ったネコが生み出されます。neko1 と neko2 が両方生み出せているのは上述の init メソッドのおかげです。neko1 の情報を初期化(リセット)して新たに neko2 を生み出しているのです。
では、必殺技を出力してみましょう。
neko1.hissatsu()
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
子ネコ特有の特徴を持ちつつ、親ネコの特徴も受け継いでいることが確認できました。
では、必殺技メソッドとごあいさつメソッドを実行してみましょう。
koneko.hissatsu()
koneko.say_hello()
子ネコ特有の必殺技とごあいさつを実行することができました。
まとめ
・オブジェクトとは属性とメソッドをカプセル化したもの
・Python ではクラスの中に属性やメソッドを記述していく
オブジェクト指向について理解を深めていただけたら幸いです。今後コーディングの際にもぜひご参考にしてください。
ありがとうございました!
まずは無料で学びたい方・最速で学びたい方へ
まずは無料で学びたい方: Python&機械学習入門コースがおすすめ
AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!
最速で学びたい方:キカガクの長期コースがおすすめ
続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!
AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?
無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!
- 国も企業も育成に力を入れている先端 IT 人材とは
- キカガクの研修実績
- 長期コースでの学び方、できるようになること
- 料金・給付金について
- 質疑応答
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。