質問

私はこのようなものを持っています

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top