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:)

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top