accesso variabili classe statica della classe genitore in Python
-
28-09-2019 - |
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ì:)
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