Pythonでは静的なクラス変数は可能ですか?

Pythonでクラスの変数やメソッドを静的にすることはできますか?そのためにはどのような構文が必要ですか?

ソリューション

クラス定義の内部で宣言され、メソッドの内部では宣言されていない変数は、クラス変数またはスタティック変数です。

>>> class MyClass:
...     i = 3
...
>>> MyClass.i
3 

millerdev](https://stackoverflow.com/questions/68645/static-class-variables-in-python#answer-69067)が指摘するように、これはクラスレベルの i 変数を作成しますが、これはインスタンスレベルの i 変数とは異なります。

>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)

これは C++ や Java とは異なりますが、インスタンスへの参照を使ってスタティックなメンバーにアクセスできない C# とはあまり変わりません。

Python チュートリアルがクラスとクラスオブジェクトについて述べていること]1を参照してください。

静的メソッド]2については、Python Library Reference の "Built-in Functions"3でも説明されているので、@Steve Johnsonがすでに回答しています。

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

beidy](#68747)さんは staticmethod よりも [classmethod][4] を推奨しています。もしあなたもそうなら、それはおそらく問題ではないでしょう。

[4]: https://docs.python.org/3/library/functions.html#classmethod

解説 (10)

個人的には、スタティックなメソッドが必要なときは、必ずクラスメソッドを使います。主な理由は、クラスを引数として受け取ることができるからです。

class myObj(object):
   def myMethod(cls)
     ...
   myMethod = classmethod(myMethod) 

デコレーターを使う

class myObj(object):
   @classmethod
   def myMethod(cls)

静的なプロパティの場合...Pythonの定義を調べてみましょう。変数は常に変化します。変数には mutable と immutable の2種類があります。また、クラス属性とインスタンス属性があります。javaやc++でいうところの静的属性のようなものはありません。

クラスと何の関係もないのに、なぜパイソン的な意味でスタティックメソッドを使うのでしょうか?私があなただったら、classmethodを使うか、クラスから独立したメソッドを定義します。

解説 (2)

pythonのスタティックメソッドは[classmethod][1]と呼ばれています。次のコードを見てみましょう。

class MyClass:

    def myInstanceMethod(self):
        print 'output from an instance method'

    @classmethod
    def myStaticMethod(cls):
        print 'output from a static method'

>>> MyClass.myInstanceMethod()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unbound method myInstanceMethod() must be called [...]

>>> MyClass.myStaticMethod()
output from a static method

メソッド myInstanceMethod を呼び出すと、エラーが発生することに注意してください。これは、そのメソッドがこのクラスのインスタンスで呼び出されることを要求しているためです。メソッド_myStaticMethodは、デコレーター @classmethod_を使ってクラスメソッドとして設定されています。

ちょっとした工夫として、クラスのインスタンスを渡すことで、このクラスの_myInstanceMethod_を呼び出すことができます、以下のように。

>>> MyClass.myInstanceMethod(MyClass())
インスタンスメソッドの出力

[1]: http://pyref.infogami.com/classmethod

解説 (1)