Frage

Ich habe wie diese some

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

Kann ich auf die __a Klassenvariable in B? Es ist möglich, schriftlich a statt __a, ist dies der einzige Weg? (Ich denke, die Antwort könnte eher kurz sein: ja:)

War es hilfreich?

Lösung

So ist __a keine statisch Variable, es ist eine Klassenvariable. Und wegen der doppelten Unterstrich, es ist ein Namen Variable verstümmelt. Das heißt, um es Pseudo-private, wird es automatisch umbenannt statt _<classname>__<variablename> __<variablename>. Es kann immer noch durch Instanzen von zugegriffen wird, dass die Klasse nur als __<variablename>, Subklassen nicht bekommen, diese spezielle Behandlung.

Ich würde empfehlen, dass Sie den doppelten Unterstrich nicht verwenden, nur einen einzigen Unterstrich (a) markiert, dass es privat ist, und (b) die Namen Mangeln zu vermeiden.

Andere Tipps

Siehe es als A._A__a. In Python, Symbole mit einem __ Präfix innerhalb einer Klassendefinition vorkommen _<class-name> Präfix sie etwas " private ". Somit ist die Referenz A.__a, das erscheint in der Definition von B ist, counterintuitively, ein Verweis auf A._B__a:

>>> class Foo(object): _Bar__a = 42
... 
>>> class Bar(object): a = Foo.__a
... 
>>> Bar.a
42

Es gibt Python Dekorateure @staticmethod und @classmethod, die Sie verwenden können, eine Methode statisch oder klassenbezogenen zu erklären. Dies sollte Ihr Klassendatenelement hilft Zugriff:

class MyClass:
     __a = 0

     @staticmethod
     def getA():
         return MyClass.__a

class MyOtherClass:

     def DoSomething(self):
         print MyClass.getA() + 1

Beispiel von dieser Quelle inspiriert: http://www.rexx.com/~dkuhlman/python_101/python_101.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top