Pythonで静的属性を宣言するにはどうすればよいですか?
メソッドを宣言する方法は次のとおりです。 Pythonの静的メソッド?
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つは普通)。混同しないでください。
クラスの本体内で宣言されたすべての変数は「静的」属性です。
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は、先頭のアンダースコアを削除した現在のクラス名です。このマングリングは、クラスの定義内で発生する限り、識別子の構文上の位置に関係なく行われます。
それに追加するだけで、クラスだけでなく、関数にも静的変数を含めることができます。
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
静的属性は、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
_