Domanda

Ho someting come questo

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

Posso accedere alla variabile di classe __a in B? E 'possibile scrivere a invece di __a, è questo l'unico modo? (Credo che la risposta potrebbe essere piuttosto breve: sì:)

È stato utile?

Soluzione

Quindi, __a non è un static variabile, è una variabile di classe. E a causa della sottolineatura doppia porta, è un maciullato variabile . Che è, per renderlo pseudo-privato, che è stato rinominato in automagically _<classname>__<variablename> invece di __<variablename>. Si può ancora accedere da istanze di quella classe solo come __<variablename>, sottoclassi non si ottiene questo speciale trattamento.

Mi consiglia di non utilizzare il carattere di sottolineatura che porta doppia, solo un singolo trattino basso (a) contrassegno che è privato, e (b) per evitare il nome mangling.

Altri suggerimenti

si riferiscono ad essa come A._A__a. In Python, simboli con un prefisso __ verificano all'interno di una definizione di classe sono preceduti da _<class-name> per renderli alquanto " privata ". Così il A.__a riferimento che compare nella definizione di B è, counterintuitively, un riferimento a A._B__a:

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

Ci sono Python decoratori @staticmethod e @classmethod, che è possibile utilizzare per dichiarare un metodo statico o di classe legati. Questo dovrebbe aiutare l'accesso al tuo elemento di dati di classe:

class MyClass:
     __a = 0

     @staticmethod
     def getA():
         return MyClass.__a

class MyOtherClass:

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

Esempio ispirato da questa fonte: http://www.rexx.com/~dkuhlman/python_101/python_101.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top