‍🦔 【Python】オブジェクト指向学習 - インターフェース -
作成日: 2021/07/07
0

注意)このTicketはあくまで自分用のメモ。厳密な定義などは参考サイトを参照のこと

インターフェースについて学ぶ

参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。

インターフェースとは

実装を持たない抽象型のこと(詳しくは参考サイト2を参照)

pythonでの書き方

pythonにはJavaやC#のようなインターフェースは実装されていない。
同じような機能を表現しようとしたら抽象クラスを用いる必要がある。

from abc import ABCMeta, abstractmethod

#Playerインターフェース
class Player(metaclass=ABCMeta):
    @abstractmethod
    def play(self):
        pass

    @abstractmethod
    def stop(self):
        pass
  
    @abstractmethod
    def seek(self,position):
        pass

#動画再生クラス
class VideoPlayer(Player):
    def __init__(self,path):
        #何か処理があるつもりです
        print(path + 'からファイルをロードしました')

    def play(self):
        #何か処理があるつもりです
        print('動画を再生する処理を実行しました')
    
    def stop(self):
        #何か処理があるつもりです
        print('動画を停止する処理を実行しました')

    def seek(self,position):
        #何か処理があるつもりです
        print('動画の再生場所を' + str(position) + 'に変更しました')

#音楽再生クラス
class AudioPlayer(Player):
    def __init__(self,path):
        #何か処理があるつもりです
        print(path + 'からファイルをロードしました')

    def play(self):
        #何か処理があるつもりです
        print('音楽を再生する処理を実行しました')
    
    def stop(self):
        #何か処理があるつもりです
        print('音楽を停止する処理を実行しました')

    def seek(self,position):
        #何か処理があるつもりです
        print('音楽の再生場所を' + str(position) + 'に変更しました')

def sample(player):
    player.play() #再生
    player.seek(0.5) #半分まで再生場所を移動
    player.stop() #停止

if __name__=='__main__':
    print('### 動画再生のテスト ###')
    VIDEOPLAYER = VideoPlayer('my/video.mp4')
    sample(VIDEOPLAYER)

    print('### 音楽再生のテスト ###')
    AUDIOPLAYER = AudioPlayer('my/audio.mp4')
    sample(AUDIOPLAYER)

実行結果

### 動画再生のテスト ###
my/video.mp4からファイルをロードしました
動画を再生する処理を実行しました
動画の再生場所を0.5に変更しました
動画を停止する処理を実行しました
### 音楽再生のテスト ###
my/audio.mp4からファイルをロードしました
音楽を再生する処理を実行しました
音楽の再生場所を0.5に変更しました
音楽を停止する処理を実行しました

インターフェース どういったときに使う?

参考サイト1,3を参照。
自分の解釈では「機能」を表現するときに使えそう。再生機能、空を飛ぶという機能、物体が持つ機能という側面をコードで表すときにインターフェースを使うとハマりそう(例を見ると機能を表現しているものが多い)。その表現する機能は勿論複数のクラスで使われるもの、将来的に複数のクラスで使われそうなものを選ぶ。

書いたコード

github

参考サイト

  1. インターフェース【コードで理解する】 - プログラミング相談所オンライン
  2. wiki:インタフェース (抽象型)
  3. インターフェースって何のメリットがあるんですか?
  4. PythonでC#やJavaのinterfaceみたいなものを実現する

フリーランスでpythonエンジニアとして働きたく勉強中。 前職は運用SEとセキュリティエンジニア。 開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。