【Python6】pythonの文法⑤<オブジェクト指向編>

それでは下記の記事の続きをやっていこう!
👇前回までは<モジュール編>ということでコードを読み書きする上で必要な知識や知っておいて欲しいことをまとめました。

今回は<オブジェクト指向編>になります。一緒に勉強していこう🤓

オブジェクト指向とは

✅オブジェクト指向: OOP(Object Oriented Programming)
✅Pythonはオブジェクト指向のプログラミング言語
✅データのまとまりや、機能を備えた関数をプログラミングする際の考え方や概念

クラス(class)

✔️classの定義はsnake_caseではなくCamelCaseをとる
✔️class Person: ↔︎class Person(object):は同義⇨これはobjectクラスの継承をしている
(objectはpythonにデフォルトで設置されているオブジェクトであり、書いても書かんででも良い)
✔️def __init__(self): にコンストラクタ(最初の設定)を書いていく
✔️classを呼び出すことをインスタンス化するといい、<変数>(⬅️インスタンス名) = <class名>(引数)の形をとる
✔️class内のコンストラクタを呼び出すには<インスタンス化した変数>.<呼び出したい変数>とする

ex.1)Personというクラスを作り、インスタンス化して属性とメソッドを呼び出す

ex.2) Carクラス(参考)

インスタンス変数とクラス変数(instance/class variable)

✔️インスタンス変数:インスタンスに紐付いている変数
<インスタンス名>.<インスタンス変数>で変数にアクセスする
✔️クラス変数:クラスに紐付いている変数
<インスタンス名>.<クラス変数>で変数にアクセスできる。しかし上書きしないように注意

ex.) クラス変数を使った例(銀行口座の名前、口座番号、預金額、預かり、引き出しができるシステム)

スタティックメソッド(static method)

✔️インスタンスに紐づかないmethod
✔️@staticmethodデコレータを使う
✔️主にクラス内で便利関数のように使用
✔️引数にselfを取らない
✔️クラスからアクセスして呼び出す(<Class>.<staticmethod>())
✔️クラスの情報を使う時はクラスメソッドを使う

static methodの基本的な使い方

ex.) static methodを使った例(先ほどの銀行口座の例に取引(trainsaction)を記録する仕組みを追加)

※取引(transaction)として保持する情報は下記としdictionaryとして保持、list型でインスタンス変数に保持させる。
・withdrow/depositの金額
・新しい残高
・日時(日時を作る関数はstaticmethodで作る)

クラスメソッド(class method)

✔️インスタンスに紐づかないmethod
✔️@classmethodデコレータで明示
✔️クラス内で便利関数のように使う
✔️第一引数に”cls“を取り、クラスの情報にアクセスすることが出来る
✔️クラスからアクセスしてcallする(<Class>.<classmethod>)
✔️クラスの情報を使わない場合はスタティックメソッドを使う

ex.) class methodを使った例(生年月日を引数にクラスメソッドを実行すると年齢が返ってくる)

名前修飾(name mangling)

✔️private変数は、クラス外からアクセスできない変数(↔︎public変数)
✔️Pythonには”private変数”はない
✔️変数名の接頭辞に”_”(アンダースコア)を付けることでnon public風にすることが出来る(暗黙の了解であり強制力はない)
✔️”__“(アンダースコア2つ)を変数名に付けることで名前修飾する()
 名前修飾された変数名は_<Class>__<atttribute>のような形を取る(ex. _Account__balance)
 結果としてprivate変数のような役割を付けることが出来る

getterとsetter

✔️インスタンスからインスタンス変数にアクセスしたり、外部から値を代入するようなコードが走った時に制約をかけることが出来る(コードを確認して欲しいが、マイナスの値をageに代入するなど)
✔️propertyというビルドインファンクションにsetter,getter関数を引数に取ることでpropertyオブジェクトが生成される(<変数> = property(<setterの関数>, <getterの変数>))
✔️getterとsetterの引数となるインスタンス変数は必ず“_”(アンダースコア)を付け、non publicな変数とする

プロパティデコレータ(property decorator)

✔️↑のsetter,getterの書き方よりもこちらの書き方が一般的(コメントに変更箇所の詳細を記入しているので確認してみて下さい。)

継承(inheritance)

✔️あるクラスを引数に新たなクラスを定義することで、そのクラスを継承して別のクラスを作ることが出来る
✔️super class(親クラス、基底クラス)の記述内容を引継ぎ、sub class(子クラス、派生クラス)として拡張することが出来る。
✔️継承は基本”is a”の関係になっている(ex. Carクラス、Priusクラス ⇨ Prius is a Car)

継承時のコンストラクタ

✔️親クラスのコンストラクタは、子クラスのinit関数内でsuper().__init()で呼び出すことが出来る

ex.) トラッククラスを作ってみる(Carクラスを継承したTruckクラスを作る)

Carクラスを継承したTruckクラスに最大積載量、現在の積載量の属性を定義し、loadメソッドで積荷を乗せたり降ろしたり出来るコードを実装してみる

オーバーライド(overriding)

✔️superclassのメソッドを、subclass用に書き換える/追加すること
✔️オーバーロード(overloading:同じ関数だけど引数が違う)とは別物なので注意(Pythonにオーバーロードはない)

ex.) Carクラス(superclass)のgasメソッドをオーバーライドしてTruckクラスのgasメソッドで上書きする

ex.) 継承時の名前修飾(親、子クラスに同じ名前の関数がある時、subclassからのオーバーライドを避ける方法)

Polymorphism(ポリモーフィズム)

✔️poly⇨many, morphe⇨form:多様性のこと⇨”違う型でも同じ振る舞いをする”という意味
✔️printオブジェクトもポリモーフィズムを実現している例(printはint, str, bool, dictなんでも出力することが出来る)
✔️継承はポリモーフズムを実現する手段の一つ

DuckTyping(ダックタイピング)

✔️動的型付け言語を理解する上で必要な考え方
✔️動的型付け言語の理解を深める時によく用いられるフレーズ
 ”It walks like a duck and quacks like a duck, it must be a duck”
 アヒルのように歩き、アヒルのように鳴くなら、アヒルに違いない
✔️Pyhtonで言うと、『オブジェクトのクラス(型)かどうかではなく、どう振る舞うか』ということ
✔️↑”intか”, “strか”よりも”演算ができるか”に注目し、『演算ができるのであれば、intとして扱いましょう!』と言うこと

Docstringの書き方

✔️下記のように書くのが一般的だが、社内やチームでのルールに従い必ず記述すること

これでpythonの文法<オブジェクト指向編>は終了です、いかがだったでしょうか?
オブジェクト指向の概念、クラスやクラス継承など、Pythonの習得する上で最も重要で、知っておかなければならないことが盛り沢山だったかなと思います。
一度で全部吸収し切るのは難しいため、今後の学習で詰まったら必ず立ち戻れるようにしておきたいところです🙆‍♂️

次回はpythonをコーディングする上での決まりごとや標準ルールについて、”StyleGuide”を使って学習していきます。可読性の高い、綺麗なコードを書くためには知っておいて欲しいことがたくさんありますので、一緒に学習していきましょう☀️

今回はこの辺で、ばいばい👋