Доступ к статической переменной класса родительского класса в Python - PullRequest
3 голосов
/ 18 июня 2010

У меня есть нечто подобное

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 в B?Можно написать a вместо __a, это единственный способ?(Я думаю, что ответ может быть довольно коротким: да:)

Ответы [ 3 ]

7 голосов
/ 18 июня 2010

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

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

3 голосов
/ 18 июня 2010

Обращайтесь к нему как 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
1 голос
/ 18 июня 2010

Существуют 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

...