スタティックメソッドって静的メソッドとも言いますよね。性的とか変換されて困るんですが。性的メソッド。悪くないな。
で、あれだ。Pythonだとメソッドの第一引数に明示的にselfとか書く訳だが、それは全然苦にならない。元々そういう仕組みだろ的な。C++で常にauto thisとか書けと言われたら困るが。ちなみにselfじゃなくてthisでも何でも任意の名前で構わないようだが、まあ素直にselfと書こう。
そんな俺も、selfを使わない時にまで書くのは別の意味で苦になる。つーか使われない引数は気持ち悪いし。
そんな時はもちろんあれが欲しくなる。性的な奴。じゃなくてスタティックなメソッド。Pythonにもあるのかな。あったあった。クラスメソッドとスタティックメソッド。…二つもあるんですか?
で、違いを調べる。クラスメソッドはクラスを第一引数clsに取る、スタティックメソッドは何も取らない、のか。はあ。いまいちわかんね。つーか継承した時、どのクラスにバインドされるん。
試しに適当な基底クラスと派生クラスと普通のメソッドを作ってみて、クラスメソッドやスタティックメソッドに書き変えて挙動の違いを見てみたところ、どの種類のメソッドでも多態の挙動は同じだった。継承ツリーの探索過程が同じで、渡される引数だけ違うのかな。インスタンスを第一引数selfに与えるのが普通のメソッド、インスタンスのクラスを第一引数clsに与えるのがクラスメソッド、引数を追加しないのがスタティックメソッド、か。多分。
で、何の為に分かれてるんだろう、これらは。
適当に調べてもいまいち分からんので、仕方なく英語で検索。すぐに出てきた。ちくしょう英語め。
英語様によると、インスタンス変数に触るなら普通のメソッド、クラス変数だけ触れればいいならクラスメソッド、その辺に全く触らなくていいならスタティックメソッド、とのこと。
ああ、最初に自分で思ってたじゃん。self要らない時は書きたくない、って。
つまり、selfもclsも要らないなら、selfもclsも書かないスタティックメソッド。self要らないけどcls要るなら、clsを書くクラスメソッド。self要るなら普通メソッド。くそう。簡単な話じゃないか。
まあ、本当にこれでいいのかは知りませんが。
とりあえず、基底クラスのメソッドAから別の多態なスタティックメソッドBを呼び出す、みたいな使い方はちゃんと動いてるようだが。
One thought on “Pythonのクラスメソッドとスタティックメソッドで悩む”