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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top