Python Works

Pythonで色々プログラミングする

Python入門 - 継承と包含 考え方編

継承とは?

あるクラスの特性(つまり、データや機能)を別のクラスに引き継がせることを「継承(英語でインヘリタンス)」と言います。

例えば、「動物」を考えてみましょう。一口に「動物」といっても、その中には「人」もあれば、「魚」もあります。他にも「犬」や「鳥」もあるでしょう。この時、「人」や「魚」は別のクラスだと言えますが、どちらも「動物」の一種です。例えば「動物」は「ものを食べる」という機能を持っています。「人」も「魚」も「ものを食べる」生き物ですが、これは「人」も「魚」も、どちらも「動物」だからですね。

この「BはAである(B is a A)」という関係を「is-a」関係と言います。

「is-a」関係をプログラム上で表現したものが、継承です。つまり、「動物」クラスを継承して「人」クラスを作成するということです。この時、軽傷元である「動物」クラスを「親クラス(スーパークラス)」といい、軽傷先である「人」クラスを「子クラス(サブクラス)」と言います。

 

継承は便利な機能で、オブジェクト指向プログラミングの大事な要素ですが、上手に使わないと、とてもわかりにくいプログラムになってしまいます。継承は、クラスとクラスの間に強い「依存関係」を作るからです。継承は明確な「is-a」関係がある時に、継承すべきかどうか考えるようにしましょう。

また、次に呼べる「包含」を利用すべきではないかも一緒に考えましょう。

 

包含とは?

先ほどの「動物」の例えを使ってもう少し考えてみましょう。他にも「人」や「魚」、「鳥」に共通する要素はないでしょうか?割とたくさん思いつくのではないでしょうか?例えば、「骨」とか「脳」とか「筋肉」は共通していそうですよね。では、「人」は「骨」を継承すべきなのでしょうか?

先ほどの継承でも説明しましたが、継承は「is-a」関係の時に使うものです。「人は骨である」と言えるかどうか考えるわけです。考えるまでもなく、答えはノーです。

しかし、「骨は人の一部である」とか「魚は骨を持っている」とかいうことはできそうです。このように「BはAを持っている(含んでいる)」というような関係を包含関係とか「has-a」関係などと言います。

包含でも、クラスAの特性をクラスBで利用することができます。しかし、クラス間の依存度は、継承に比べれば小さいです。

 

具体的な使い方は、次の記事で説明したいと思います。