variables Accès classe statique de classe parent en Python
-
28-09-2019 - |
Question
Je someting comme ceci
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
Puis-je accéder à la variable de classe __a
dans B
? Il est possible a
d'écriture au lieu de __a
, est-ce la seule façon? (Je suppose que la réponse pourrait être assez court: oui:)
La solution
Alors, __a
est pas statique variable, il est une variable de classe. Et à cause de la double premier trait de soulignement, c'est un nom mutilée variables . C'est, pour le rendre pseudo-privé, il a été renommé automagiquement _<classname>__<variablename>
au lieu de __<variablename>
. Il peut encore être consulté par des instances de cette classe seulement __<variablename>
, ne reçoivent pas les sous-classes ce traitement spécial.
Je vous recommande de ne pas utiliser la double underscore de premier plan, un seul trait de soulignement (a) marque qu'il est privé, et (b) pour éviter le nom mutiler.
Autres conseils
Reportez-vous à ce que A._A__a
. En Python, les symboles avec un préfixe __
survenant à l'intérieur d'une définition de classe sont préfixées avec _<class-name>
pour les rendre un peu " privé ". Ainsi, le A.__a
de référence qui apparaît dans la définition de B
est, contre-intuitivement, une référence à A._B__a
:
>>> class Foo(object): _Bar__a = 42
...
>>> class Bar(object): a = Foo.__a
...
>>> Bar.a
42
Il y a de Python et de @staticmethod
@classmethod
, que vous pouvez utiliser pour déclarer une statique méthode ou liée à la classe. Cela devrait aider à accéder à votre élément de données de classe:
class MyClass:
__a = 0
@staticmethod
def getA():
return MyClass.__a
class MyOtherClass:
def DoSomething(self):
print MyClass.getA() + 1
Exemple inspiré par cette source: http://www.rexx.com/~dkuhlman/python_101/python_101.html