[備忘メモ]python:クラスメソッドとインスタンスメソッド

こんばんは、クロです。
3日坊主になりそうですが今日もやっていきまーしょう!

前置き

SEからWebエンジニアに転職したら全くわからないことだらけで、毎日知らない言葉が出てくる…
ので後から見た時に「当時自分が何で困っていたのか」を振り返れるようにすることが目的です。
詳しく調べて書く時間はないので、大体30分以内に書ききれるレベルの内容にしていきたいです。

…これを見ても答えは書いてないので技術情報探している方は他の記事を見た方がためになると思います。

出てきた場面

いざ業務で書いてたら@classmethodってなんだっけってなった。
あと引数のselfとclsの違いがよくわからなくなった…俺は雰囲気でpythonを書いている…

ざっくりした理解

・クラス=設計図、インスタンス=実体
ってまぁオブジェクト指向云々をちらっとかじったら100%出てくる単語ですね。
ここは普通に理解できるのでパス。クラスが学生で、インスタンスが太郎君と花子ちゃんって感じでしょ?(適当)

・インスタンスメソッドはインスタンスに紐付いて、第1引数を”self”とする
・クラスメソッドはクラスに紐付いて、第1引数を”cls”とする
→は?大体インスタンスメソッドで良くない?設計図に紐づくってことは全体に同じ処理したいってこと?

・クラスメソッドを使うべき場合について
Rubyの記事ですが下記が想像しやすかったので引用します。

反対に、どのようなときにクラスメソッドを用いれば良いのでしょうか?

上記の例で言えば「外部からデータを取得する処理」が一番多いシチュエーションだと思います。

DBからデータを読みだして、新たにインスタンスを生成する
ファイルからデータを読みだして、新たにインスタンスを生成する
オブジェクトを参照して、新たにインスタンスを生成する
一般にこのようなメソッドをファクトリメソッドと呼びます。インスタンスを生成する光景をファクトリ、工場に見立ててそう呼んでいます。

引用元:インスタンスメソッドとクラスメソッドはどのようにして使い分けるべきか?(Rubyの場合)

Python Djangoだと、クラスメソッドを使うとモデル内にobjectメソッドを綺麗に書けるらしい。
確かにモデル = DBの定義だしDBから複数のレコード取ってきてまとめて処理する感じかな?
参考:【Python】インスタンスメソッド、staticmethod、classmethodの違いと使い方

色々調べてたら30分経った

今日も今日とて何となくわかったけどすっきりしない…色々調べても明確に使い分ける場面がわからない…
とりあえず代替可能だけど綺麗に書くならクラスメソッド込みで設計すべきという理解をしました。
色々作っていく内にわかるようになることを期待して今日はここまで!

無能をさらけ出してるだけの気がするので心が折れかけてます。

その他参考リンク

インスタンスメソッド・クラスメソッド・スタティックメソッド
Pythonにおけるインスタンスメソッドとクラスメソッドの使い分けについて
Understanding the difference between `self`and `cls` as they refer to the same attributes