2011-06-28 4 views
2

Si l'on remplace la méthode magique __getattr__ dans une classe, la méthode substituée est appelée uniquement lorsque l'attribut est introuvable, sinon le comportement par défaut se produit.__setattr__ uniquement lorsque l'attribut n'existe pas

Mais cela ne semble pas être le cas avec __setattr__, il affecte tous les attributs. Ce que je cherche est quelque chose qui se comporte normalement quand l'attribut existe et suit un code personnalisé quand l'attribut n'existe pas. Et comment appelle-t-on super sur __setattr__?

+5

Eh bien, définir un '__setattr__' qui vérifie si l'attribut est déjà là, le cas échéant « se comporter normalement » et sinon ajoutez votre magie? – delnan

Répondre

2

Vous pouvez utiliser un __getattr__ personnalisé pour savoir si l'attribut existe ou non.

Pour définir l'attribut avec le comportement par défaut, you do something like:

object.__setattr__(self, name, value) 
4
class ClassName(object): 
    def __setattr__(self, name, value) 
     if hasattr(self, name): 
      super(ClassName, self).__setattr__(name, value) 
     else: 
      magic 
+2

Notez que 'hasattr' consulte' __getattr__', c'est-à-dire qu'il ne vérifie pas s'il y a vraiment un tel attribut dans '__dict__',' __slots__' ou quoi que ce soit mais si 'self.name' fonctionne. – delnan

+0

En effet, mais ce n'était pas dans la portée de la question si je comprends bien. –

Questions connexes