2010-02-28 18 views
3

Quelle (s) méthode (s) spéciale (s) devrais-je redéfinir dans ma classe afin qu'elle traite les exceptions AttributeError et renvoie une valeur spéciale dans ces cas?Quelle méthode spéciale dans Python gère AttributeError?

Par exemple,

>>> class MySpecialObject(AttributeErrorHandlingClass): 
     a = 5 
     b = 9 
     pass 
>>> 
>>> obj = MySpecialObject() 
>>> 
>>> obj.nonexistent 
'special value' 
>>> obj.a 
5 
>>> obj.b 
9 

Je googlé pour la réponse, mais n'a pas pu le trouver.

+0

Notez que 'pass' ici est inutile. –

+0

Les attributs 'a' et' b' sont des attributs de classe auxquels vous accédez sur l'instance 'obj'. Il n'y a rien de mal à cela, mais c'est inhabituel. Comprenez-vous comment définir les attributs d'instance? –

+0

@voyager, Dans votre édition, vous avez inventé 'AttributeErrorHandlingClass' comme mécanisme d'acquisition des valeurs d'attribut de secours. Ce n'est probablement pas la bonne façon d'obtenir ce comportement dans une classe particulière. –

Répondre

4

L'exemple de la façon d'utiliser __getattr__ par Otto Allmendinger overcomplicates son utilisation. Vous devez simplement définir tous les autres attributs et, s'il en manque un, Python se rabattra sur __getattr__.

Exemple:

class C(object): 
    def __init__(self): 
     self.foo = "hi" 
     self.bar = "mom" 

    def __getattr__(self, attr): 
     return "hello world" 

c = C() 
print c.foo # hi 
print c.bar # mom 
print c.baz # hello world 
print c.qux # hello world 
+0

Voici comment je l'ai fait avant de lire la réponse d'Otto. :) Merci! – bodacydo

1

Votre question ne me semble pas claire, mais il semble que vous cherchez __getattr__ et éventuellement __setattr__ et __delattr__.

+0

Oh. Ce que je veux faire est quand l'objet n'a pas la propriété donnée, il retourne une valeur spéciale. Par exemple, étant donné que 'obj' a la propriété' a' écrire 'obj.a' renvoie la valeur de' a'. Mais quand 'obj' n'a pas de propriété, comme' nosuch' alors écrire 'obj.nosuch' renvoie la valeur' special value'. Cette explication est-elle logique? – bodacydo

1

Vous avez ne remplacent __getattr__, il fonctionne comme ceci:

class Foo(object): 
    def __init__(self): 
     self.bar = 'bar' 

    def __getattr__(self, attr): 
      return 'special value' 

foo = Foo() 
foo.bar # calls Foo.__getattribute__() (defined by object), returns bar 
foo.baz # calls Foo.__getattribute__(), throws AttributeError, 
     # then calls Foo.__getattr__() which returns 'special value'. 
+0

Merci d'avoir parlé des pièges! Avant de lire votre réponse complète, j'ai fait ceci: class Foo (objet): def __init __ (auto): self.attrx = 'valx' ... def __getattr __ (auto, attr): retourne 'valeur spéciale' et ça a fonctionné ! Cela devrait-il ou devrait-il ne pas fonctionner vraiment? – bodacydo

+0

Par "en quelque sorte travaillé" je veux dire quand j'ai accédé 'foo_obj.attrx' il a renvoyé' valx', mais quand j'ai accédé 'foo_obj.nonexist' il a renvoyé 'valeur spéciale'. – bodacydo

+0

Ce n'est pas une bonne utilisation de '__getattr__' du tout. '__getattr__', par opposition à' __getattribute__', fonctionne comme une méthode de repli si les attributs significatifs sont déjà définis, donc vous n'avez pas besoin de rechercher les attributs normaux dans '__getattr__'. –