variable de clase estática de acceso de la clase padre en Python
-
28-09-2019 - |
Pregunta
He calle detrás como esto
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
¿Puedo acceder a la variable de clase __a
en B
? Es posible a
escritura en lugar de __a
, es esta la única manera? (Supongo que la respuesta podría ser más bien corta: si:)
Solución
Así, __a
no es un estática variables, que es una variable de clase. Y debido a la doble subrayado que lleva, es un destrozado variables . Es decir, para que sea pseudo- privada, que ha sido rebautizado automágicamente a _<classname>__<variablename>
en lugar de __<variablename>
. Todavía se puede acceder a instancias de esa clase única como __<variablename>
, subclases no reciben este tratamiento especial.
Yo recomendaría que no utilice el carácter de subrayado que lleva doble, un solo guión bajo para (a) la marca que es privada, y (b) para evitar el nombre mangling.
Otros consejos
se refieren a ella como A._A__a
. En Python, símbolos con un prefijo __
presenta dentro de una definición de clase se prefijan con _<class-name>
para hacerlos algo " " privado. Así, el A.__a
referencia que aparece en la definición de B
es, counterintuitively, una referencia a A._B__a
:
>>> class Foo(object): _Bar__a = 42
...
>>> class Bar(object): a = Foo.__a
...
>>> Bar.a
42
Hay @staticmethod
y @classmethod
Python decoradores, que se puede utilizar para declarar un método estático o relacionados con su clase. Esto debería ayudar a acceder a su elemento de datos de la clase:
class MyClass:
__a = 0
@staticmethod
def getA():
return MyClass.__a
class MyOtherClass:
def DoSomething(self):
print MyClass.getA() + 1
Ejemplo inspirado por esta fuente: http://www.rexx.com/~dkuhlman/python_101/python_101.html