さて、今回はPythonでのオブジェクト指向プログラミングを学習しようかと思います。プログラム上で扱う対象をオブジェクト(モノ)に見立てて、オブジェクトを中心にコードを組み立てていく手法をオブジェクト指向プログラミングといいますが、Pythonでオブジェクト指向プログラミングを組むのは初めてです。
PythonはJavaのような純正オブジェクト指向言語と違い、型(クラス)の定義が不可欠というわけではなく、むしろ、クラスで凝り固まったコードはPython的ではないので、オブジェクト指向によるコードの再利用性、保守性の向上という利点に取り組みながら、Pythonの手軽なコーディングに組み込んでいきたいと思います。
class Person:
pass
if __name__ == '__main__':
p = Person()
print(p)
<__main__.Person object at 0x0000029B2AD9BDD0>
クラスが正しく認識できていますので、次に行きたいと思います。
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
if __name__ == '__main__':
p1 = Person('太郎', '山田')
p2 = Person('花子', '鈴木')
print(f'私の名前は{p1.lastname}{p1.firstname}です!')
print(f'私の名前は{p2.lastname}{p2.firstname}です!')
私の名前は山田太郎機能をです!
私の名前は鈴木花子です!
今度はクラスの中にインスタンス変数を追加してみました。インスタンス(オブジェクト)に属する変数を追加することにより、インスタンスが意味のある値を持つことができます。__init__という初期化メソッドでインスタンス変数を定義し、その下の構文でドット演算子を使い定義されたインスタンス変数にアクセスしています。
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
if __name__ == '__main__':
p1 = Person('太郎', '山田')
p1.age = 52
p2 = Person('花子', '鈴木')
print(p1.age)
print(p2.age)
ちなみにこちらはエラーが出るプログラムですが、ここで言いたいことは、「個々に生成されたインスタンスは互いに別物である」ということです。p1にageというインスタンスを新たに追加していますが、この追加したageはp1だけのものであり、p2には反映されないということです。
Pythonの場合同一クラスのもとに生成されたインスタンスであっても、それぞれが持つ変数が同一であるとは限りません。
次にメソッドです。クラス(型)にかかわる共通的な処理は、メソッドとしてクラスにまとめることができます。
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def show(self):
print(f'私の名前は{self.lastname}{self.firstname}です!')
if __name__ == '__main__':
p = Person('太郎', '山田')
p.show()
私の名前は山田太郎です!
ここでは、Personクラスにインスタンス変数を表示するためのメソッド(showメソッド)を追加しました。Pythonではインスタンスから「.」でアクセスできるものはすべてアトリビュートです。つまり、メソッドもアトリビュートです。よって、インスタンス変数と同じくメソッドもまた、classブロックとは別に、後から追加することができます。
今回はPythonのオブジェクト指向プログラミングについて学習しました。またそのうち続きを投稿したいと思います。
エンジニアファーストの会社 株式会社CRE-CO H.M