こんにちは、Yuinaです!
今日は、インターフェイスの話をしていきます。
まず、インターフェイスを理解するためにはいくらか知っておきたい前提条件があります。
実際にコードを見ながら説明していきます。
クラスとインスタンス
メイクの道具(クラス):
class Makeup:
def apply(self):
pass # ここでは具体的な実装をしない
まず、メイクをするための「道具(クラス)」を作るとしましょう。例えば、リップ、アイシャドウ、チークなど、メイクのアイテムはそれぞれ異なる方法で使われます。
ですが、このままだと実際にメイクをする方法(メソッド)が決まっていません。
継承メソッド
メイクの方法(メソッド):
from abc import ABC, abstractmethod
class Makeup(ABC):
@abstractmethod
def apply(self):
"""メイクをする方法(実際の方法は子クラスで定義する)"""
pass
メイク道具ごとに異なる「塗り方」を実装するために、Makeup
というクラスを抽象クラスにして、apply
メソッドを抽象メソッドとして定義しています。抽象メソッドは、具体的な実装は親クラスでは行わず、子クラスで実装することを強制します。
継承とオーバーライド
次に、リップやアイシャドウなど、具体的なメイクアイテムに対してこの抽象メソッドをオーバーライド(再実装)します。これにより、各メイクアイテムがどのように塗られるかが決まります。
class Lipstick(Makeup):
def apply(self):
print("Applying lipstick...")
class Eyeshadow(Makeup):
def apply(self):
print("Applying eyeshadow...")
Lipstick
クラスとEyeshadow
クラスは、Makeup
クラスを継承し、apply
メソッドをそれぞれ実装しています。このように、apply
メソッドの動作は子クラスによって異なります。
ポリモーフィズム(多態性)
そして、ポリモーフィズムを使って、メイクアイテムを同じapply
メソッドで一括して扱うことができます。つまり、どのメイクアイテムであっても、apply
メソッドを呼び出すことで適切なメイクの方法が実行されるということです。
def apply_makeup(item: Makeup):
item.apply()
# 実行
lipstick = Lipstick() # Lipstickクラスのインスタンス(設計図から実際のオブジェクトを作る)
eyeshadow = Eyeshadow() # Eyeshadowクラスのインスタンス
apply_makeup(lipstick) # リップを塗る (メソッドを実行。インスタンスに対して動作を起こす)
apply_makeup(eyeshadow) # アイシャドウを塗る
ちなみに、item: Makeup
は昨日の投稿でご紹介した型ヒントです。具体的には、apply_makeup
という関数の引数item
が、Makeup
クラスかその子クラス(Lipstick
やEyeshadow
など)であることを示しています。
つまり、この関数apply_makeup
は、Makeup
というクラスまたはそのサブクラス(子クラス)のインスタンスを受け取ることができると明示しています。
インターフェイスとは?
インターフェイスは、「メイクの道具を使うためのルール」みたいなものです。
例えば、メイクをするとき、どんな道具(リップ、アイシャドウ、チーク)を使うにしても、「必ず使うべき手順」があると思います。例えば、「リップを塗るときは、必ず塗り方を教えてくれる人が必要」だとか。
- インターフェイス=必ずメイクをするときに従うルール
「リップを塗るには、まず塗り方を教えてくれる人が必要!」 - 具体的な道具(インスタンス)=リップスティックやアイシャドウ
「リップスティックなら、リップの塗り方を知ってる。アイシャドウならアイシャドウの塗り方を知ってる」
インターフェイスを使ったクラス(メイクのルール):
from abc import ABC, abstractmethod
# メイクのインターフェイス(塗り方を教えてくれる人)
class MakeupInstructor(ABC):
@abstractmethod
def apply(self):
pass # 何か書かないとエラーになるためとりあえず書きました
インターフェイスとして、「塗る手順を教えるメイクインストラクター」がいます。彼女は、どんな道具を使っても必ずメイクの手順を教えてくれるという役割だけを持っています。でも、実際に「どう塗るか」は教えません。
リップスティックやアイシャドウが具体的に実装する部分:
# リップスティック(塗り方を教えてくれる人のルールに従って、実際にリップを塗る)
class Lipstick(MakeupInstructor):
def apply(self): # applyはメイクの「塗る」動作を表すメソッド
# クラスのインスタンス(オブジェクト)を指します。
print("リップを塗っています...")
# アイシャドウ(同じルールに従って、実際にアイシャドウを塗る)
class Eyeshadow(MakeupInstructor):
def apply(self):
print("アイシャドウを塗っています...")
次に、リップスティックやアイシャドウのような実際のメイク道具(インスタンス)は、インターフェイス(塗り方を教えてくれる人)の指示に従って、その塗り方を実際に実行します。
どうしてインターフェイスが必要?
インターフェイス(メイクのルール)があることで、どんな道具(リップ、アイシャドウ、チーク)を使っても、必ず「塗り方を教えてくれる人」の指示を受けることになります。
これによって、全てのメイク道具で共通の「塗り方」が決まるので、混乱せずに作業が進みます。
まとめ
今日はインターフェイスの話をしました。
インターフェイス(ルール)を使うことで、どんな道具を使っても必ず同じ方法で塗れるようになることがわかりました。
上記のように、共通のルールを持たせることでメイクの流れを統一する役割を果たしていると言うことがわかりました😊
ありがとうございました!