self と cls とかが何か気になって調べてみた + @staticmethod
python 書いてると”ふと”気になる self と cls を調べメモ。
なんで書くのかなぁという疑問が解消すると、結構気持ちよくかけるようになった気がします。書いてる人には、あたりまえ話ですいません。
# 各種メソッドとかスコープについては、何も説明ないので、別のサイトみて確認ください
self について
クラスの中で定義する インスタンス・メソッド (instance method)では、必ず第一引数に self を書きます。
class MyClass(object): def instance_method(self, x, y): print x+y my = MyClass() my.instance_method(1,2) 3
第一引数に self と書くのですが、呼び出し時には 第二引数以降を渡します。selfには「インスタンス自身」が入ります。自動的入る仕様なのですね。
なお、Official ドキュメントにもありますが、文字列としては self 以外でも大丈夫とのこと。ただし慣習的に self を使うことになってるので、そうしましょうとのこと。
9. クラス — Python 2.7ja1 documentation
ほんとにどんな文字列でもいいの?を含め self については、このエントリーの説明がよく分かります。yoshiori.hatenablog.com
cls について
同じくクラスの中で定義する クラス・メソッド (class method)。デコレーターの @classmedhod に続いてメソッドを定義しますが、こちらは第一引数に cls を書きます。
class MyClass(object): @classmethod def class_method(cls, x, y): print x+y MyClass.class_method(1,2) 3
インスタンス・メソッドと同じ呼び出し方をしますが、 cls には「クラス自身が入る」ところが違う点。ここを self と書いても動作はしますが、self にクラスがはいった状態でコーディングするので、ちょいと気持ち悪い感じになりそう。クラスがはいってるよという明示的な要素も含めて cls を使うべきかと思います。
どっちも書かない staticmethod
クラス中に定義するメソッドは、もう一つ スタティック・メソッド (static method) があります(僕は使ったことないのですが、調べてて知りました)。こいつは、第一引数に特別なものがはいらないので、ただの関数と同じようにかけます。
こちらのエントリーで、staticmethod の使いドコロが説明されています。mojix.org
その他
現段階では、そこまではっきりと使い分け出来てないのが現状。
3種類の使い分けなどは、色々エントリーがあるので、今後勉強しようと思います。
- Python - クラスメソッドとスタティックメソッドについて - Qiita
- インスタンスメソッド・クラスメソッド・スタティックメソッド - PASL
- classmethodとstaticmethodデコレータの違い - SELECT * FROM life;
- staticmethodとclassmethodの違いでC++的な静的メソッドを考える - YAMAGUCHI::weblog
- pythonのstaticmethodとclassmethod : fat runnerのいろいろな記録と挑戦
- python - Difference between Class and Instance methods - Stack Overflow