web-dev-qa-db-fra.com

Accéder aux variables membres d'une classe en Python?

class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

Comment accéder à la variable d'une classe? J'ai essayé d'ajouter cette définition:

def return_itsProblem(self):
    return itsProblem

Pourtant, cela échoue aussi.

53
Adam

La réponse, en quelques mots

Dans votre exemple, itsProblem est une variable locale.

Vous devez utiliser self pour définir et obtenir des variables d'instance. Vous pouvez le définir dans la méthode __init__. Alors votre code serait:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

Mais si vous voulez une vraie variable de classe, utilisez directement le nom de la classe:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)

Mais soyez prudent avec celui-ci, car theExample.itsProblem est automatiquement défini pour être égal à Example.itsProblem, mais n'est pas du tout la même variable et peut être modifié indépendamment.

Quelques explications

En Python, les variables peuvent être créées dynamiquement. Par conséquent, vous pouvez effectuer les opérations suivantes:

class Example(object):
    pass

Example.itsProblem = "problem"

e = Example()
e.itsSecondProblem = "problem"

print Example.itsProblem == e.itsSecondProblem 

empreintes 

Vrai

C'est donc exactement ce que vous faites avec les exemples précédents.

En effet, en Python, nous utilisons self comme this, mais c'est un peu plus que cela. self est le premier argument d'une méthode d'objet, car le premier argument est toujours la référence de l'objet. C'est automatique, que vous l'appeliez ou non self.

Ce qui signifie que vous pouvez faire:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

ou:

class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

C'est exactement pareil. Le premier argument de la méthode objet ANY est l'objet actuel, nous l'appelons uniquement self en tant que convention. Et vous n’ajoutez qu’une variable à cet objet, comme vous le feriez de l’extérieur.

Maintenant, à propos des variables de classe.  

Quand tu fais:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

Vous remarquerez que nous commençons par définissons une variable de classe , puis nous accédons à un objet (instance) variable . Nous n'avons jamais défini cette variable d'objet mais cela fonctionne, comment est-ce possible?

Eh bien, Python essaie d’obtenir d’abord la variable objet, mais s’il ne le trouve pas, il vous donnera la variable de classe. Attention: la variable de classe est partagée entre les instances et la variable d'objet ne l'est pas.

En conclusion, n'utilisez jamais de variables de classe pour définir les valeurs par défaut des variables d'objet. Utilisez __init__ pour cela.

Finalement, vous apprendrez que les classes Python sont des instances et donc des objets eux-mêmes, ce qui permet de mieux comprendre ce qui précède. Revenez et lisez ceci plus tard, une fois que vous réalisez cela.

104
e-satis

Vous déclarez une variable locale et non une variable de classe. Pour définir une variable d'instance (attribut), utilisez

class Example(object):
    def the_example(self):
        self.itsProblem = "problem"  # <-- remember the 'self.'

theExample = Example()
theExample.the_example()
print(theExample.itsProblem)

Pour définir une variable class (membre statique.k.a.), utilisez

class Example(object):
    def the_example(self):
        Example.itsProblem = "problem"
        # or, type(self).itsProblem = "problem"
        # depending what you want to do when the class is derived.
9
kennytm

Si vous avez une fonction d’instance (c’est-à-dire une fonction qui passe elle-même), vous pouvez utiliser self pour obtenir une référence à la classe en utilisant self.__class__

Par exemple, dans le code ci-dessous, tornado crée une instance pour gérer les demandes d’obtention, mais nous pouvons obtenir la classe get_handler et l’utiliser pour gérer un client riak, de sorte que nous n’avons pas besoin de la créer pour chaque demande. 

import tornado.web
import riak

class get_handler(tornado.web.requestHandler):
    riak_client = None

def post(self):
    cls = self.__class__
    if cls.riak_client is None:
        cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc')
    # Additional code to send response to the request ...
0
andrew pate