Pythonによるオブジェクト指向プログラミング(OOP)のコンセプト
著者:Leonardo Giordani - 26/04/2020
この記事では、初心者のPythonプログラマーがPythonのOOPについて学ぶべき主なコンセプトを確認します。これらの内容は、各セクションの最後にリンクされているブログの他の記事で詳細に説明されています。
基本
オブジェクト指向プログラミング(OOP:Object Oriented Programming) はパラダイムの1つで、メンテナンスや修正を容易にすることを目的としたコードの構造化の方法です。しばしば、OOPは関数型プログラミング(FP: Functional Programming) と対立するものと考えられていますが、実際にはどちらのパラダイムも有用であり、現代の言語の中には両方を実装しているものもあります(例えば、Scala)。PythonはFPパラダイムのいくつかの機能を実装していますが、優れたPythonプログラマーになりたければ、OOPを理解しなければなりません。
さらに、OOPは概念的なパラダイムなので、PythonがどのようにOOPを実装しているか、つまり、他のプログラミング言語では当てはまらない、Pythonの世界の特定のルールを学ばなければなりません。
OOPのようなパラダイムは、コードを再利用可能にし、変更を容易にするという単一の目的を持っているというのが、あなたが学ばなければならないコアコンセプトです。これを覚えておかないと、理解せずに盲目的にルールを学ぶことになり、つまり、厳密にしなければならないときと、曲げなければならないときがわからなくなってしまうのです。
3つの柱
OOPには3つの大きな柱があります。
データのカプセル化(Data Encapsulation): データ構造とそれを処理する機能を結びつけるために、データのカプセル化が導入されています。オブジェクトはクラスから生成され、プライベートコード(データ構造の低レベルの詳細を管理するためのコード)とパブリックコード(システムの他の部分で利用可能なコード)の分離します。
委譲(Delegation): 委譲は、OOPがコードの再利用する方法です。委譲によって、システム内のオブジェクトは共同作業を行い、コードの重複を避けることができます。継承(暗黙の委譲)や合成(明示的な委譲)によって実装することができます。
ポリモーフィズム(Polymorphism) : ポリモーフィズムは、OOPがアルゴリズムの再利用を促進する方法です。ポリモーフィズムが正しく実装されていれば、内部構造が全く異なるオブジェクトでも、同じアルゴリズムで処理し、連携することができます。これにより、リファクタリングやコードメンテナンスが促進され、古いコードを新しい実装に置き換えることができます。
参考資料
Pythonがこれらの3つの主要なコンセプトをどのように実装しているかについては、以下の記事をお読みください。
データのカプセル化:
委譲:
ポリモーフィズム:
これらはすべて同じシリーズの記事の一部なので、全体像を把握するために読んでみてください。また、YouTubeで公開している以下のビデオでも、同じコンセプトを説明しています。
Video Object-oriented programming in Python - Part 1 - Basic concepts https://www.youtube.com/watch?v=1Jc41dIVOk8&list=PLWtCrYLGt7T3DUFPYdqrdEqzt-OCfBQ5O&index=2&t=0s
Video Object-oriented programming in Python - Part 2 - Types and classes in Python https://www.youtube.com/watch?v=-O7OHmrQMfc&list=PLWtCrYLGt7T3DUFPYdqrdEqzt-OCfBQ5O&index=3&t=0s
Video Object-oriented programming in Python - Part 3 - How to create a class https://www.youtube.com/watch?v=_b18YfmEvTg&list=PLWtCrYLGt7T3DUFPYdqrdEqzt-OCfBQ5O&index=4&t=0s
Video Object-oriented programming in Python - Part 4 - Classes and instances https://www.youtube.com/watch?v=6ZPXR0Gj0GU&list=PLWtCrYLGt7T3DUFPYdqrdEqzt-OCfBQ5O&index=5&t=0s
Video Object-oriented programming in Python - Part 5 - Delegation: inheritance and composition https://www.youtube.com/watch?v=FLwxJrwYHbo&list=PLWtCrYLGt7T3DUFPYdqrdEqzt-OCfBQ5O&index=6&t=0s
クラスとデリゲーションに慣れるためには、この2つの簡単な記事で復習することができます。
以下の記事は、OOP設計のシンプルだが非常に有用な演習であり、テスト駆動開発(TDD)も使用しています。
TDDといえば、Mock に慣れるべきです。Mock は、一緒に動作するテストオブジェクトを作る際に非常に便利です。
より複雑なコンセプトに進む前に、これらのOOPとTDDの基本的なコンセプトでどのようなものが作れるかを見てみましょう。
私の著書「Clean Architectures in Python」をまとめた次の記事で説明しています。
ここまで来れば、大物に立ち向かう準備はできているはずです。ここから先は上級者向けの概念なので、前のセクションに慣れてからここに進むようにしてください。しかし、あまり怖がらないでください。これらの概念は高度なものですが、不可能ではありません。もしあなたがPythonを上手に使いたいのであれば、少なくともそれらが何であるかを理解するべきです。
メタクラス:
抽象ベースクラス:
多重継承:
最後に
いやー、盛りだくさんでしたねー。もちろん、PythonのOOPについて言えることをすべて網羅したわけではありませんが、これらの記事があなたのこの重要なパラダイムに関する知識を高め、より良いPythonプログラマになれることは間違いありません。