5

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

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ですが、これが唯一の方法ですか?(答えはかなり短いかもしれません:はい:)

4

3 に答える 3

10

つまり、静的__a変数ではなく、クラス変数です。また、先頭に2つのアンダースコアが付いているため、名前がマングルされた変数になります。つまり、疑似プライベートにするために、の代わりに自動的に名前が変更されました。サブクラスはこの特別な扱いを受けないため、そのクラスのインスタンスからのみアクセスできます。_<classname>__<variablename>__<variablename>__<variablename>

(a)プライベートであることを示すため、および(b)名前の混乱を避けるために、二重の先頭の下線を使用せず、単一の下線のみを使用することをお勧めします。

于 2010-06-18T14:57:22.453 に答える
3

として参照してくださいA._A__a__Pythonでは、クラス定義内に接頭辞が付いているシンボルには、接頭辞を付けて_<class-name>、いくらか「プライベート」にします。したがって、A.__aの定義に表示される参照Bは、直感に反して、A._B__a:への参照です。

>>> class Foo(object): _Bar__a = 42
... 
>>> class Bar(object): a = Foo.__a
... 
>>> Bar.a
42
于 2010-06-18T14:45:48.013 に答える
1

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

于 2010-06-18T14:48:30.867 に答える