Доступ к переменной статической классы из родительского класса в Python

StackOverflow https://stackoverflow.com/questions/3070543

Вопрос

Я имею вроде этого

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

Могу ли я получить доступ к __a Переменная класса In B? Это возможно написать a вместо __a, Это единственный способ? (Я думаю, что ответ может быть довольно коротким: Да :)

Это было полезно?

Решение

Так, __a не а статический Переменная, это классная переменная. И из-за двойного ведущего подчеркивания, это Название Mangled Переменная. То есть, чтобы сделать его псевдо-частным, он автоматически переименован в _<classname>__<variablename> вместо __<variablename>. Отказ Это все еще можно получить доступ к экземплярам Только этот класс так как __<variablename>, Подклассы не получают это особое лечение.

Я бы порекомендовал, чтобы вы не использовали двойную ведущую подчеркивание, просто один подчеркивающий отметку до (A), что он является частным, а (B), чтобы избежать поклонения имени.

Другие советы

Обратитесь к этому как A._A__a. Отказ В Python, символы с __ Префикс, происходящий внутри определения класса, префиксирован с _<class-name> чтобы сделать их несколько "частный". Отказ Таким образом, ссылка A.__a который появляется в определении B есть, оправданно, ссылка на A._B__a:

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

Есть декораторы Python @staticmethod а также @classmethod, который вы можете использовать, чтобы объявить метод статическим или классовым. Это должно помочь доступом к элементу данных вашего класса:

class MyClass:
     __a = 0

     @staticmethod
     def getA():
         return MyClass.__a

class MyOtherClass:

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

Пример, вдохновленный этим источником:http://www.rexx.com/~dkuhlman/Python_101/python_101.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top