独学プログラマー14章読んでみた:オブジェクト指向プログラミング
こんにちは。
お久しぶりすぎです。
14章は13章の続きって感じでした。
クラス変数とインスタンス変数
オブジェクト指向プログラミングはクラス変数とインスタンス変数という2種類の変数が存在します。今までにコードで書いてきた"self.[変数名]=[値]"というように書くものはインスタンス変数です。クラス変数はクラス内で通常の変数と同じ様に定義します。
上の例では、
- クラス変数:recs(空のリスト)
- インスタンス変数:width, length
という感じです。
クラス変数が便利なのは、クラスから作られたインスタンスオブジェクトのどこからでも利用できるデータとして使えることで、クラス変数があればグローバル変数を使わずに、クラスのインスタンス間でデータを共有できます。
なので、上のコードを実行すると3つ作ったRectangleクラスのインスタンスのwidthとlengthが、作られるときにrecsのリストに追加していくので、Rectangle.recsを表示させると
[ ( 10,20 ),( 20,30 ),( 30,40 ) ]
と表示されます。
クラス変数に定数を持たせるのは一般的に行われますが、クラス変数を更新するのはグローバル変数を使う場合と同じ問題に遭遇するのでできるだけ避けるべきらしい。
特殊メソッド
インスタンスを作り、そのインスタンスを表示させようとすると( print("インスタンス名") )pythonはobjectクラスから継承している__rapr__という特殊メソッドを呼び出します。
上のrec1を表示させると
<__main__.Rectangle object at 0x1014a0ef0>
という様な文字が出力されます。
その__repr__をオーバーライドすることでこの出力を変更することができます。
さっきの上で書いたコードに__repr__メソッドを追加してrec1を表示させるときちんと
width=10,length=20
と表示させることができました。
いつも特殊メソッドのオーバーライドはreturnの形にするというのを私は忘れがち。。
特殊メソッドは他にも__add__とか色々あるみたい。
isキーワード
isキーワードは前後のオブジェクトが同一のオブジェクトならTrue、違うオブジェクトならFalseを返すものです。やってみたほうが早い!
これは上のRectangleクラスのインスタンスを3つ作り、一つ目のrec1をrec_1という別の変数に代入したものです。
- print( rec1 is rec_1 )は同一のオブジェクトなのでTrue
- print( rec2 is rec_1 )は違うオブジェクトなのでFalse
と出力されます。長いコードを書くときに確認するために使ったりするのかな。if文の中に使ったりもするみたい。( if x is None : )など。
次の章は”知識をまとめる”だから何かゲームを作るのかな!多分!
明日研究室で発表なので何も発表できることないけど頑張って資料作ります〜。。病み。。