Pythonのクラス、最速理解特集:Visual Studioで始めるPythonプログラミング(3/4 ページ)

» 2016年11月11日 05時00分 公開
[かわさきしんじInsider.NET編集部]

クラスの継承

 本稿の冒頭でも述べた通り、基底クラスを指定しない場合、クラスはobjectクラスの派生クラスとなる。基底クラスを指定してクラスを定義するには、次のように「class 派生クラス名(基底クラス名のリスト):」のように基底クラスを指定する。

class 派生クラス名(基底クラス名のリスト):
  クラス定義


クラスの継承

 「既定クラス名のリスト」となっていることから分かる通り、Pythonでは多重継承がサポートされている。

 まずはシンプルな単一継承の例を見てみよう。

class Base:
  def __init__(self, base_mem):
    self.base_mem = base_mem

class Derived(Base):
  def __init__(self, base_mem, derived_mem):
    super().__init__(base_mem)
    self.derived_mem = derived_mem

d = Derived("base", "derived")
print(d.base_mem)
print(d.derived_mem)


クラスの継承

 上で述べたようにDerivedクラスでは「class Derived(Base):」として、基底クラスがBaseクラスであることを示している。重要なのは、Derivedクラスの__init__メソッド内だ。基底クラスの__init__メソッドを「super().__init__(base_mem)」という形で呼び出している(組み込み関数superで基底クラスを参照し、その__init__メソッドを呼び出しているということだ)。Pythonでは組み込み関数superは他にも多くの場面で使用される。例えば、オーバーライドされたメソッドから基底クラスの同名のメソッドを呼び出す場合などがそうだ。というわけで、次にメソッドのオーバーライドを見てみよう。

メソッドのオーバーライド

 先ほどのBaseクラスとDerivedクラスにインスタンスメソッドmethodを追加したコードを以下に示す。

class Base:
  def __init__(self, base_mem):
    self.base_mem = base_mem

  def method(self):
    print("method on Base")

class Derived(Base):
  def __init__(self, base_mem, derived_mem):
    super().__init__(base_mem)
    self.derived_mem = derived_mem

  def method(self):
    print("method on Derived")

d = Derived("base", "derived")
d.method()


インスタンスメソッドのオーバーライド

 この場合、BaseクラスのインスタンスメソッドmethodはDerivedクラスのインスタンスメソッドmethodに隠蔽される。よって結果は次のようになる。

>>> class Base:
...   def __init__(self, base_mem):
…… 省略 …‥
...
>>> d = Derived("base", "derived")
>>> d.method()
method on Derived


実行結果

 Derivedクラスのインスタンスメソッドmethodから基底クラスの同名メソッドを呼び出したい場合には次のようにする。

class Derived(Base):
  def __init__(self, base_mem, derived_mem):
    super().__init__(base_mem)
    self.derived_mem = derived_mem

  def method(self):
    super().method()
    print("method on Derived")


基底クラスの同名メソッドを呼び出す

 先ほどの__init__メソッドと同様に「super().method()」として基底クラスのインスタンスメソッドmethodを呼び出せる。これはクラスメソッドでも同様だ。

 本稿の最後に、多重継承についても簡単に見ておこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。