読者です 読者をやめる 読者になる 読者になる

AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

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