244 votes

Python : accès aux propriétés de classe à partir d'une chaîne de caractères

J'ai une classe comme la suivante :

class User:
    def __init__(self):
        self.data = []
        self.other_data = []

    def doSomething(self, source):
        // if source = 'other_data' how to access self.other_data

Je veux passer une chaîne de caractères pour la variable source en doSomething et accéder au membre de la classe du même nom.

J'ai essayé getattr qui ne fonctionne que sur les fonctions (d'après ce que je peux dire) ainsi que d'avoir User étendre dict et en utilisant self.__getitem__ mais cela ne fonctionne pas non plus. Quelle est la meilleure façon de procéder ?

338voto

Alex Martelli Points 330805

x = getattr(self, source) fonctionnera parfaitement si source nomme TOUT attribut de self, y compris l'attribut other_data dans votre exemple.

227voto

Robert Rossney Points 43767

Une image vaut mille mots :

>>> class c:
        pass
o = c()
>>> setattr(o, "foo", "bar")
>>> o.foo
'bar'
>>> getattr(o, "foo")
'bar'

87voto

Yas Points 53
  • getattr(x, 'y') est équivalent à x.y
  • setattr(x, 'y', v) est équivalent à x.y = v
  • delattr(x, 'y') est équivalent à del x.y

5voto

Markus Points 1248

En prolongeant légèrement la réponse d'Alex :

class User:
    def __init__(self):
        self.data = [1,2,3]
        self.other_data = [4,5,6]
    def doSomething(self, source):
        dataSource = getattr(self,source)
        return dataSource

A = User()
print A.doSomething("data")
print A.doSomething("other_data")

donnera des résultats :

\[1, 2, 3\]
\[4, 5, 6\]

Cependant, personnellement, je ne pense pas que ce soit un grand style - getattr vous permettra d'accéder à n'importe quel attribut de l'instance, y compris des éléments tels que l'attribut doSomething elle-même, ou même la méthode __dict__ de l'instance. Je vous suggère d'implémenter plutôt un dictionnaire de sources de données, comme ceci :

class User:
    def __init__(self):

        self.data_sources = {
            "data": [1,2,3],
            "other_data":[4,5,6],
        }

    def doSomething(self, source):
        dataSource = self.data_sources[source]
        return dataSource

A = User()

print A.doSomething("data")
print A.doSomething("other_data")

qui cède à nouveau :

\[1, 2, 3\]
\[4, 5, 6\]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X