Доступ к переменной статической классы из родительского класса в Python
-
28-09-2019 - |
Вопрос
Я имею вроде этого
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.