2009-01-27 10 views
1

J'essayais d'écrire du code qui vérifierait si un élément avait des attributs, et de les appeler. J'ai essayé de faire ça avec getattr, mais les modifications ne seraient pas permanentes. J'ai fait une classe «fictive» pour vérifier cela. Voici le code je pour la classe:appel de méthodes sur une instance avec getattr [python]


class X:           
    def __init__(self): 
    self.value = 90 
    def __get(self): 
    return self.value 
    def __set(self,value): 
    self.value = value 
    value = property(__get,__set) 

x = X() 
print x.value # this would output 90 
getattr(x,"value=",99) # when called from an interactive python interpreter this would output 99 
print x.value # this is still 90 (how could I make this be 99 ?) 

Merci!

Répondre

8

Vous devez faire quelque chose comme

class X:           
    def __init__(self): 
    self._value = 90 

    def _get(self): 
    return self._value 

    def _set(self, value): 
    self._value = value 

    value = property(_get, _set) 

Notez que la variable « interne » doit avoir un nom différent de la propriété (je _value).

Ensuite,

setattr(x, 'value', 99) 

devrait fonctionner.

+0

C'est ce que je cherchais! Je vous remercie ! – Geo

+0

Je suis tout nouveau à Python, dans quelles circonstances adopteriez-vous cette approche? – Kev

+0

J'écris une classe qui ajoute du support XPath à BeautifulSoup, et j'ai besoin de vérifier si la soupe a un attribut passé en chaîne. – Geo

2
getattr(x,"value=",99) 

retourne 99 car x n'a pas d'attribut "value =" (notez le signe égal), getattr retourne la valeur par défaut fourni (99).

+0

il semble que l'OP a confondu getattr et setattr ... – Algorias