クラスの超基礎4.継承

継承の概念をサポートしない言語機能はクラスと呼ぶに値しないとこちらのページでいわれているほど重要な要素である継承についてです。
継承を一言で言えばクラスを定義する時にメンバ変数とメソッドを他のクラスからコピーして、追加・変更のあるメンバのみを新たに定義するやり方のこと、というかんじでしょうか。

Testクラスを継承してTest2クラスを定義してみます。

# coding: shift_jis

class Test:
  
  def __init__(self,x,y):
    self.a = x
    self.b = y
  
  def plus(self):
    return self.a + self.b
  
  def minus(self):
    return self.a - self.b

class Test2(Test):          #ここで引数(?)のように書いて継承
  
  def __init__(self,x,y,z):
    Test.__init__(self, x, y)
    self.c = z
    
  def plus(self):                       #plusメソッドを上書き
    return self.a + self.b + self.c
  
  
a = Test(3,5)

print a.plus() #8

print a.minus() #-2
  
b = Test2(7,8,9)

print b.plus() #24

print b.minus() #-1

plusメソッドはTest内でも定義されていますが、Test2で再定義しているので上書きされTest2では3つの数字を加算するメソッドになっているのに対し、minusメソッドはTest2では定義されていないためTestの物が引き続き有効になっています。

若干ややこしいのは

def __init__(self,x,y,z):
    Test.__init__(self, x, y)
    self.c = z

の部分でしょうか。
"__init__"関数内で"Test"の"__init__"を実行してa,bを定義した後さらにcも定義しているのですが"__init__"は継承されないのかというとそうではなく次の例のように書いた場合、Test3の"__init__"は実行されa,bのみは定義されています。

class Test3:
  
  def __init__(self,x,y):
    self.a = x
    self.b = y
  
  def plus(self):
    return self.a + self.b
  

class Test4(Test3):
    
  def minus(self):
    return self.a - self.b
  
  
a = Test3(3,5)

print a.plus() #8

  
b = Test4(7,8)

print b.plus() #15

print b.minus() #-1

ただしこの場合メンバ変数が同じなのにメソッドのみを追加した新しいクラスを作成したことになるので、これだったら元のTest3クラスにminusメソッドを追加したらいいだけということになりますね。