クラスを定義する最大の利点は「使い回しができること」です。一度作ってしまえば、あとはそれをそのままコピーしてあちこちで利用できます。
ただし、実際に使ってみると「ここはもっとこうしたほうがいい」ということが出てくるでしょう。が、ある程度の規模のプログラムになってきて、あちこちでクラスを使っていると、この修正は用意ではありませんね。
こんなとき、実に便利な機能が用意されています。それは「
継承」というものです。
継承というのは、既にあるクラスをそのまま受け継いで、新しいクラスを作ることです。「受け継ぐ」というのは、つまり「クラスにあるすべての機能をそのまま引き継ぐ」ということです。つまり、そのクラスにあるものをまるごとそっくり貰って、新しいクラスが作れるのです。
この継承を使ってクラスを定義するには、以下のようにしてクラスを作ります。
def クラス名 ( 継承するクラス ):
……クラスの内容……
継承では、継承する元のクラスを「
基底クラス」、新しく作ったクラスを「
派生クラス」といいます。
実際の利用例を下のリストにあげておきましょう。ここでは、
Memberクラスを継承して、
PowerMemberという派生クラスを作っています。
このPowerMemberクラスでは、
def __init__(self,str1,str2):というようにして、2つの引数を用意しました。そして、
self.nameと
self.mailにそれぞれ設定をしています。――だけど、あれ? ちょっと考えてみてください。
よく見てみると、この
PowerMemberクラスには「
mail」だけしかインスタンス変数が用意されていませんね。それなのに、
self.nameの値はちゃんと保管されています。これは、基底クラスである
Memberに
nameが用意されているからです。継承は、基底クラスにある機能を全て受け継いで利用することができます。従って、
PowerMemberに
nameを用意する必要はないのです。
メンバー変数に限らず、メソッドもすべてスーパークラスにあるものはそのまま使うことができます。この継承を使えば、既にあるクラスをどんどん拡張して機能強化していけるというわけです。
Pythonでは、さまざまなクラスがライブラリに用意されています。そして、それらを利用する際、この「継承」が使われています。
例えば、先に「リスト」「タプル」「レンジ」といったコンテナについて説明をしましたね。これらも、実はすべて「クラス」として用意されています。これら3つのクラスに共通した機能が多いのは、「シーケンス」というインデクスで管理するコンテナクラスがあってそれを継承してリストやタプルができている、と考えるとイメージしやすいのではないでしょうか。
class Member:
name = ""
def __init__(self,str):
self.name = str
def showMsg(self):
print("Hello," + self.name + ".How are you?")
class PowerMember (Member):
mail = ""
def __init__(self,str1,str2):
self.name = str1
self.mail = str2
def showMsg(self):
print("Hello," + self.name + ".")
print("Your mail address is '" + self.mail + "'.")
taro = Member("Taro")
taro.showMsg()
hanako = PowerMember("Hanako","hanako@flower.com")
hanako.showMsg()