Pythonのオブジェクト指向プログラミング(OOP)は、他の言語と考え方は似ていますが、よりシンプルで柔軟な構文を持っています。この章では、クラスの定義から継承、そしてPython特有の「マジックメソッド」まで、その基本を学びます。
Pythonでは、class
キーワードを使ってクラスを定義します。JavaやC++のように波括弧{}
は使わず、インデントでブロックを示します。非常にシンプルです。
クラスを定義したら、関数を呼び出すようにクラス名()
と書くことで、そのクラスのインスタンス(オブジェクト)を生成できます。
python dog1.py
Pythonのクラスでは、__init__
という名前の特殊なメソッドがコンストラクタの役割を果たします。このメソッドは、クラスがインスタンス化される際に自動的に呼び出されます。
メソッドの最初の引数にはself
を書くのが慣習です。これはインスタンス自身への参照であり、JavaやC++のthis
に相当します。ただし、Pythonではself
を明示的に引数として記述する必要があります。
python dog2.py
Pythonのクラスには、2種類の変数があります。
self.変数名
のように__init__
内などで定義され、各インスタンスに固有の値を持ちます。上の例のname
やage
がこれにあたります。python dog3.py
クラス内で定義される関数をメソッドと呼びます。インスタンスのデータ(インスタンス変数)を操作するために使用します。
メソッドを定義する際も、最初の引数には必ずself
を指定する必要があります。これにより、メソッド内からself
を通じてインスタンス変数にアクセスできます。
python dog4.py
型安全性を高めるために、クラス変数やインスタンス変数にも型アノテーション(型ヒント)を付けることができます。
変数名: 型 = 値
のように記述します。__init__
内で self.変数名: 型 = 値
のように記述するか、クラス直下で 変数名: 型
と宣言だけしておくこともできます。python dog5.py
あるクラスの機能を引き継いだ新しいクラスを作成することを継承と呼びます。Pythonでは、クラス定義の際に()
内に親クラス(基底クラス)を指定することで継承を行います。
子クラス(派生クラス)は親クラスのメソッドや変数を全て利用でき、必要に応じて上書き(オーバーライド)することも可能です。親クラスのメソッドを呼び出したい場合はsuper()
を使います。
python dog6.py
__init__
のように、アンダースコア2つで囲まれた特殊なメソッドをマジックメソッド(またはダンダーメソッド)と呼びます。これらを定義することで、Pythonの組み込み関数の挙動をカスタマイズできます。
__str__(self)
print()
関数やstr()
でオブジェクトを文字列に変換する際に呼び出されます。__repr__(self)
repr()
関数で呼び出されるほか、__str__
が定義されていない場合のprint()
や、インタラクティブシェルでオブジェクトを評価した際に使われます。MyClass(arg1=1, arg2='B')
)が望ましいです。python dog7.py
class ClassName:
で定義する。
__init__(self, ...)
メソッドで、インスタンス化の際に初期化処理を行う。self
: インスタンス自身を指す参照。メソッドの第一引数として必ず記述する。class Child(Parent):
でクラスの機能を引き継ぐ。親のメソッドはsuper()
で呼び出せる。__str__
や__repr__
などを定義することで、オブジェクトの振る舞いをカスタマイズできる。この章では、Pythonにおけるオブジェクト指向プログラミングの基本を学びました。
class
キーワードでクラスという「設計図」を定義し、クラス名()
でインスタンスという「実体」を作成します。__init__
とself
: __init__
はインスタンス化の際に呼ばれるコンストラクタです。第一引数のself
はインスタンス自身を指し、self.変数名
の形でインスタンスごとにユニークなインスタンス変数を定義します。self
です。class 子クラス(親クラス):
と書くことで、親クラスの機能を引き継いだ新しいクラスを作成できます。super()
を使うことで、親クラスのメソッドを呼び出せます。__str__
や__repr__
のように__
で囲まれた特殊なメソッドで、print()
などの組み込み関数の挙動をカスタマイズできます。PythonのOOPは、JavaやC++に比べてシンプルで直感的な構文が特徴です。しかし、その裏側にある「すべてがオブジェクトである」という思想は一貫しており、非常に強力なプログラミングパラダイムです。
書籍の情報を管理するBook
クラスを作成してください。
要件:
title
(タイトル)とauthor
(著者)を引数で受け取る。info()
というメソッドを持ち、呼び出すと「{タイトル}」- {著者}
という形式の文字列を返す。print()
でインスタンスを直接表示した際に、info()
メソッドと同じ文字列が表示されるようにする。python practice6_1.py
問題1で作成したBook
クラスを継承して、電子書籍を表すEBook
クラスを作成してください。
要件:
Book
クラスを継承する。title
、author
に加えてfile_size
(ファイルサイズ、MB単位)も引数で受け取る。info()
メソッドをオーバーライドし、呼び出すと「{タイトル}」- {著者} (ファイルサイズ: {file_size}MB)
という形式の文字列を返すように変更する。python practice6_2.py