djangoでコードを書いている中で分かりにくいのが継承という考え方です。
この考え方をしっかりと学ぶことで、djangoを使いこなすレベルが間違いなく高まります。
そこで今回は、継承への理解を深めていきましょう。
継承とは、クラスの中身を引き継ぐこと
継承とは、クラスの中身を引き継ぐことです。そして、継承はdjangoではなく、Pythonの機能です。
書き方はこんな感じです。
コードclass A:
pass
class B(A):
pass
このコードにおいて、BというクラスはAというクラスを継承している。と言います。
djangoのviews.pyファイルで「 class XXXView(TemplateView)」というコードをみたことがあるかと思います。
これは、XXXViewクラスはTemplateViewクラスを承継している。と言います。
では、継承を使うと何が良いのでしょうか?具体的なコードと共に、継承について学んでいきましょう。
簡単なコードで継承を理解する
シンプルなコードで継承のイメージをわかせていきましょう。
以下のコードを見てください。
コード1 class A():
2 number = 100
3 def plus(self, a):
4 return (a+5)
5 class B(A):
6 pass
7 abc = B()
コードの解説(1) 1行目でAというクラスを作り、その中でnumberという属性と、plusというメソッドを定義しました。
(2) 5行目では、Bというクラスを作りました。このクラスでは属性やメソッドの定義はしていませんが、Aクラスを継承しています。
(3) 7行目で次の行では、Bクラスからabcというオブジェクトを作っています。
そのうえで、このようなコードを書いてみます。
コードprint (abc.number)
print (abc.plus(1))
アウトプット100
6
この結果を見ると、abcオブジェクトは、(Bクラスの中で何も定義していないにも関わらず)Aクラスが持っている属性とメソッドを使うことができました。
なぜ使うことができたのかというと、Aクラスを継承しているからです。
このように、継承を使うことによって、継承先の属性やメソッドを使うことができるようになるのです。
ポイント:継承先の属性やメソッドを書き換えることができる
djangoの継承を理解するうえでは、「書き換え」この点がポイントです。
継承の中では、継承元のクラス(先ほどの例ではBクラス)が継承先のクラス(Aクラス)を書き換えることができます。
具体的なコードで見ていきましょう。
コード1 class A()
2 number = 100
3 def plus(self, a):
4 return (a + 5)
5 class B(A):
6 def plus(self, a);
7 return (a + 1)
(1) 5行目のclass Bの中身に注目してください。Bクラスの中で「plusメソッド」が定義されていますが、これはAクラスの中でも定義されていますよね。
この結果がどうなるのかというと、クラスBで書いたplusメソッドが、クラスAのplusメソッドを上書きすることになるのです。
出力して確かめてみましょう。
コードabc = B()
print (abc.plus(1))
アウトプット2
出力が2になっていることから、Bクラスの中で定義したplusメソッドが呼び出されていることが分かります。
djagoにおける継承
次に、djangoでの継承について理解していきましょう。
まずはviews.pyファイルからです。
class SampleView(ListView):
template_name = 'sample.html'
これは、ListViewで定義しているtemplate_nameという属性を上書きしています。
つまり、TemplateViewクラスの中ではこのようなコードが書かれていることが想像できます。
コードclass ListView():
template_name = 'xxx'
実際のListViewのではTemplateViewだけではなく、たくさんの属性とメソッドが準備されています。
この属性とメソッドを使いこなすことによって、ウェブサイトやシステムの作成が簡単にできるのです。
ListViewクラスで使える主な属性
ここで、ListViewクラスで使える主な属性をご紹介します。
ListViewクラスを使うことで、便利な機能が増えた!というイメージを持つとよいのではないかと思います。
1. model = 'xx'
これは、models.pyファイルで定義したモデル(データベース)のクラス名を入れます。
例えば、本の情報を入れたBookというモデルがあったとしましょう。
ここで、model = Bookとするだけで、ListViewの中でBookモデルが使えるようになるのです。
2. queryset = xxx
querysetは、ListViewで表示するデータを絞り込むときに使われます。
例えば、queryset = Book.objects.filter(id = 10)とすることで、id番号が10のデータだけをListViewの中で表示できるようになります。
querysetについては、querysetについて分かりやすく解説という記事で詳しく解説していますので、参考にしてください。
最後に
djangoでは、非常に多くのクラスが定義されており、それらは継承を通じて使うことができる場合が多いです。
覚えることが多くてはじめは大変ですが、継承のイメージを持ちながらコードを読んでいくと、ぐっと理解が深まっていくと思います。
継承の考え方をしっかりと学び、djangoを使い倒していきましょう。