2010-06-18 4 views
3

Je someting comme çaAccès variable de classe statique de classe parente en Python

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 d'écrire a au lieu de __a, est-ce le seul moyen? (Je suppose que la réponse pourrait être plutôt courte: oui :)

+0

Quelle est la raison de l'utilisation du nom d'attribut de double trait de soulignement? Est-ce qu'un trait de soulignement n'est pas suffisant - utilisé pour indiquer un attribut 'privé'? –

+0

Eh bien, c'est quelque chose pour un expert Python de répondre ... – fuenfundachtzig

Répondre

7

Ainsi, __a n'est pas une variable statique , il est une variable de classe. Et à cause du double trait de soulignement, c'est une variable name mangled. Autrement dit, pour le rendre pseudo-privé, il a été renommé automagiquement en _<classname>__<variablename> au lieu de __<variablename>. Il peut encore être consulté par des instances de cette classe seulement comme __<variablename>, les sous-classes n'obtiennent pas ce traitement spécial.

Je vous recommande de ne pas utiliser le double trait de soulignement, juste un trait de soulignement pour (a) marquer qu'il est privé, et (b) pour éviter le nom mangling.

3

Appelez-le A._A__a. En Python, les symboles avec un préfixe __ apparaissant dans une définition de classe sont préfixés par _<class-name> pour les rendre quelque peu "private". Ainsi, la référence A.__a 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 
1

Il y a des décorateurs Python @staticmethod et @classmethod, que vous pouvez utiliser pour déclarer une méthode statique ou liée 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

+0

Devrait être def getA(): retourner A .__ un – darelf

+0

Oups, true. Corrigera. Notez également que dans mon exemple, le nom de classe est MyClass. ;) –

+0

Oups, je suppose que j'aime empiler des erreurs en plus des erreurs ... :) – darelf

Questions connexes