web-dev-qa-db-ja.com

Pythonで静的属性を宣言する方法は?

Pythonで静的属性を宣言するにはどうすればよいですか?

メソッドを宣言する方法は次のとおりです。 Pythonの静的メソッド?

36
Romulus

Pythonでクラスレベルで定義されたすべての変数は静的と見なされます

class Example:
    Variable = 2           # static variable

print Example.Variable     # prints 2   (static variable)

# Access through an instance
instance = Example()
print instance.Variable    # still 2  (ordinary variable)


# Change within an instance 
instance.Variable = 3      #(ordinary variable)
print instance.Variable    # 3   (ordinary variable)
print Example.Variable     # 2   (static variable)


# Change through Class 
Example.Variable = 5       #(static variable)
print instance.Variable    # 3  (ordinary variable)
print Example.Variable     # 5  (static variable)

同じ名前で2つの異なる変数をクラスに含めることができます(1つは静的、もう1つは普通)。混同しないでください。

61
aerokite

クラスの本体内で宣言されたすべての変数は「静的」属性です。

class SomeClass:
    # this is a class attribute
    some_attr = 1

    def __init__(self):
        # this is an instance attribute
        self.new_attr = 2

ただし、「静的」な部分は慣習によるものであり、課されるものではないことに注意してください(これについて詳しくは、 this SO thread )をお読みください。

この規則の詳細とその意味については、 公式ドキュメント からの簡単な抜粋です。

オブジェクトの内部からしかアクセスできない「プライベート」インスタンス変数は、Pythonには存在しません。ただし、ほとんどのPythonコード:アンダースコアで始まる名前(_spamなど)は、APIの非公開部分として扱われる必要があります。関数、メソッド、またはデータメンバー)実装の詳細と見なされ、予告なく変更される場合があります。

クラスプライベートメンバには有効なユースケースがあるため(つまり、サブクラスで定義された名前と名前の衝突を避けるため)、名前マングリングと呼ばれるこのようなメカニズムのサポートは制限されています。 __spam(少なくとも2つの先行アンダースコア、最大1つの後続アンダースコア)の形式の識別子は、_classname__spamにテキストで置き換えられます。classnameは、先頭のアンダースコアを削除した現在のクラス名です。このマングリングは、クラスの定義内で発生する限り、識別子の構文上の位置に関係なく行われます。

12
bosnjak

それに追加するだけで、クラスだけでなく、関数にも静的変数を含めることができます。

def some_fun():
    some_fun.i += 1
    print(some_fun.i)

some_fun.i = 0;
print(some_fun(), some_fun(), some_fun())  
# prints: 1,2,3  
8
Marcin

静的属性は、Pythonでは data attributes です。クラスで割り当てられた属性:-

_>>>class A(object):
>>>    a = 1

>>>A.a
>>>1
_

これは、インスタンスを使用して静的メンバーにアクセスできないC++およびJavaとは異なります。

_>>>inst  = A()
>>>inst.a
1
>>> 
_

また、組み込みメソッドsetattrは、static variable(data attribute)の設定に役立ちます。

_>>>setattr(A, 'b', 2)
>>>A.b
>>>inst.b
_
2
Vishnu Upadhyay