Pythonでは静的なクラス変数は可能ですか?
Pythonでクラスの変数やメソッドを静的にすることはできますか?そのためにはどのような構文が必要ですか?
1797
3
Pythonでクラスの変数やメソッドを静的にすることはできますか?そのためにはどのような構文が必要ですか?
クラス定義の内部で宣言され、メソッドの内部では宣言されていない変数は、クラス変数またはスタティック変数です。
millerdev](https://stackoverflow.com/questions/68645/static-class-variables-in-python#answer-69067)が指摘するように、これはクラスレベルの
i
変数を作成しますが、これはインスタンスレベルのi
変数とは異なります。これは C++ や Java とは異なりますが、インスタンスへの参照を使ってスタティックなメンバーにアクセスできない C# とはあまり変わりません。
Python チュートリアルがクラスとクラスオブジェクトについて述べていること]1を参照してください。
静的メソッド]2については、Python Library Reference の "Built-in Functions"3でも説明されているので、@Steve Johnsonがすでに回答しています。
beidy](#68747)さんは staticmethod よりも [classmethod][4] を推奨しています。もしあなたもそうなら、それはおそらく問題ではないでしょう。
[4]: https://docs.python.org/3/library/functions.html#classmethod
個人的には、スタティックなメソッドが必要なときは、必ずクラスメソッドを使います。主な理由は、クラスを引数として受け取ることができるからです。
デコレーターを使う
静的なプロパティの場合...Pythonの定義を調べてみましょう。変数は常に変化します。変数には mutable と immutable の2種類があります。また、クラス属性とインスタンス属性があります。javaやc++でいうところの静的属性のようなものはありません。
クラスと何の関係もないのに、なぜパイソン的な意味でスタティックメソッドを使うのでしょうか?私があなただったら、classmethodを使うか、クラスから独立したメソッドを定義します。
pythonのスタティックメソッドは[classmethod][1]と呼ばれています。次のコードを見てみましょう。
メソッド myInstanceMethod を呼び出すと、エラーが発生することに注意してください。これは、そのメソッドがこのクラスのインスタンスで呼び出されることを要求しているためです。メソッド_myStaticMethodは、デコレーター @classmethod_を使ってクラスメソッドとして設定されています。
ちょっとした工夫として、クラスのインスタンスを渡すことで、このクラスの_myInstanceMethod_を呼び出すことができます、以下のように。
[1]: http://pyref.infogami.com/classmethod