クラスの継承-その1
記事の内容
この記事では、Pythonの最もシンプルなクラスの継承方法について説明するとともに、いくつかの用語について説明します。
***わからない用語があるときは索引ページへ***
この記事のサンプルプログラムは、Python3系をベースとしています。Python2系は、クラス宣言の記述ルールが異なるのでご注意ください。
1.クラスの継承とは
Pythonに限らず、オブジェクト指向プログラミング言語では、作成済のクラスの機能を簡単に拡張できる、「クラスの継承」の仕組が用意されています。以下、サンプルプログラムを使って、クラスの継承について説明します。
2.クラスを継承する
class_keisho_ex1.pyでは、最初に加減算のみできるKagensanクラスを作成しています。次に、Kagensanクラスを継承して四則演算ができるShisokuEnzanクラスを作成するサンプルプログラムです。後ろの記事で、サンプルプログラムに沿ってクラス継承の仕組を説明します。
##class_keisho_ex1.py
##class宣言
##親クラスの作成
class Kagensan:
##コンストラクタの作成
def __init__(self, a, b):
self.x = a
self.y = b
##インスタンスメソッドの作成
def tashizan(self):
wa = self.x + self.y
return wa
def hikizan(self):
sa = self.x - self.y
return sa
##親クラスを継承して子クラスを作成
class ShisokuEnzan(Kagensan):
##メソッドを追加
def kakezan(self):
seki = self.x * self.y
return seki
def warizan(self):
sho = self.x / self.y
return sho
##プログラム実行開始位置
a = 5
b = 4
print("a =", a, "b =", b, "\n")
##ShisokuEnzanクラスのインスタンス生成
ins1 = ShisokuEnzan(a, b)
##ShisokuEnzanクラスのインスタンス変数の読み書き
print("インスタンス変数x:", ins1.x)
print("インスタンス変数y:", ins1.y)
print("\n")
##ShisokuEnzanクラスのメソッドの実行
print("a + b =", ins1.tashizan())
print("a - b =", ins1.hikizan())
print("a * b =", ins1.kakezan())
print("a / b =", ins1.warizan())
実行結果
a = 5 b = 4
インスタンス変数x: 5
インスタンス変数y: 4
a + b = 9
a - b = 1
a * b = 20
a / b = 1.25
3.クラス継承の説明
3.1.親クラスと子クラス
継承される元のクラスを親クラス(基底クラス、スーパークラスともよぶ)、親クラスを継承して、親クラスの拡張機能のプログラムが追加されたクラスを子クラス(派生クラス、サブクラスともよぶ)といいます。
class_keisho_ex1.pyの親クラスは、Kagensanクラスあり、子クラスはShisokuEnzanクラスとなります。
Kagensanクラスについては、「オブジェクト(class)の作成-その1」の記事で解説していますので、必要に応じてそちらの記事も参照してください。
3.2.子クラスのクラス宣言
親クラスであるKagensanクラスと、子クラスであるShisokuEnzanクラスのクラス宣言を見比べてみましょう。
親クラスのクラス宣言
class Kagensan:
子クラスのクラス宣言
class ShisokuEnzan(Kagensan):
子クラスのクラス宣言の際、親クラスのクラス名を引数で渡しています。クラスを継承して子クラスを作成するときは、class文で親クラスを引数に渡して宣言をします。
class <子クラス名>(<親クラス名>):
クラス宣言でクラスを継承すると、子クラスは親クラスのすべてのプロパティとメソッドを引き継ぎます。親クラスのコンストラクタも含めて子クラスに引き継がれます。
3.3.子クラスでメソッドを追加する
子クラスでは、親クラスのすべてのプロパティとメソッドを引き継いでいます。機能追加のメソッドを書き足すだけで、親クラスにメソッドを追加することができます。
class_keisho_ex1.pyのShisokuEnzanクラスをみてみましょう。
##親クラスを継承して子クラスを作成
class ShisokuEnzan(Kagensan):
##メソッドを追加
def kakezan(self):
seki = self.x * self.y
return seki
def warizan(self):
sho = self.x / self.y
return sho
ShisokuEnzanクラスは、Kagensanクラスのコンストラクタも含めた全てのプロパティとメソッドを引き継いでいます。
コンストラクタも引き継がれているので、インスタンスはKagensanクラスと同じ方法で生成できます。また、kakezanメソッドとwarizanメソッドを追加するだけで、Kagensanクラスのtashizanメソッド、hikizanメソッドも使うことができます。
class_keisho_ex1.pyのShisokuEnzanクラスのインスタンスから、各メソッドを呼び出して実行しているところを見てみましょう。
##ShisokuEnzanクラスのインスタンス生成
ins1 = ShisokuEnzan(a, b)
##ShisokuEnzanクラスのインスタンス変数の読み書き
print("インスタンス変数x:", ins1.x)
print("インスタンス変数y:", ins1.y)
print("\n")
##ShisokuEnzanクラスのメソッドの実行
print("a + b =", ins1.tashizan())
print("a - b =", ins1.hikizan())
print("a * b =", ins1.kakezan())
print("a / b =", ins1.warizan())
実行結果
インスタンス変数x: 5
インスタンス変数y: 4
a + b = 9
a - b = 1
a * b = 20
a / b = 1.25
4.高度な継承
サンプルプログラムclass_keisho_ex1.pyでは、親クラスを継承して、子クラスでメソッドを追加するだけの最もシンプルな継承方法を紹介しました。
クラスの継承においては、親クラスのプロパティやメソッドを単純に引き継ぐだけでなく、子クラスから親クラスのメソッドを呼び出して上書きしたりすることもできます。
これら高度なクラスの継承方法については、次回以降の記事で説明します。
前の記事 次の記事
この記事が気に入ったらサポートをしてみませんか?