Pythonの親クラスの静的クラス変数にアクセスします
-
28-09-2019 - |
質問
私はこのようなものを持っています
class A:
__a = 0
def __init__(self):
A.__a = A.__a + 1
def a(self):
return A.__a
class B(A):
def __init__(self):
# how can I access / modify A.__a here?
A.__a = A.__a + 1 # does not work
def a(self):
return A.__a
アクセスできますか __a
クラス変数 B
?書くことが可能です a
それ以外の __a
, 、これが唯一の方法ですか? (私は答えがかなり短いかもしれないと思います:はい:)
解決
それで、 __a
ではありません 静的 変数、それはクラス変数です。そして、ダブルリーディングのアンダースコアのために、それは 名前を壊した 変数。つまり、それを擬似プライベートにするために、それは自動的に変更されました _<classname>__<variablename>
それ以外の __<variablename>
. 。インスタンスによって引き続きアクセスできます そのクラスのみ なので __<variablename>
, 、サブクラスはこの特別な治療を受けません。
ダブルリーディングのアンダースコアを使用しないことをお勧めします。(a)プライベートであるマークと(b)マングリングを避けるために、(a)マークをマークすることをお勧めします。
他のヒント
それをとして参照してください A._A__a
. 。 Pythonでは、aのシンボル __
クラス定義内で発生するプレフィックスには、プレフィックスが付けられています _<class-name>
それらをある程度作ります "プライベート". 。したがって、参照 A.__a
それはの定義に表示されます B
直感的には、参照です A._B__a
:
>>> class Foo(object): _Bar__a = 42
...
>>> class Bar(object): a = Foo.__a
...
>>> Bar.a
42
Pythonデコレータがあります @staticmethod
と @classmethod
, 、これを使用して、静的またはクラス関連のメソッドを宣言できます。これは、クラスデータ要素へのアクセスに役立つはずです。
class MyClass:
__a = 0
@staticmethod
def getA():
return MyClass.__a
class MyOtherClass:
def DoSomething(self):
print MyClass.getA() + 1
このソースに触発された例:http://www.rexx.com/~dkuhlman/python_101/python_101.html