Comment utiliser __setattr__ correctement, éviter une récursion infinie

Je veux définir une classe contenant read et write methode, qui peut être appelé comme suit:

instance.read
instance.write
instance.device.read
instance.device.write

De ne pas utiliser entrelacé classes, mon idée était de remplacer le __getattr__ et __setattr__ méthodes et de vérifier si le nom donné est device pour rediriger le retour à self. Mais j'ai rencontré un problème en donnant un récurrences. L'exemple de code est comme suit:

class MyTest(object):
    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name=="device":
            print "device test"
        else:
            setattr(self, name, value)

test = MyTest(1)

Comme dans __init__ le code essayé de créer un nouvel attribut x, il appelle __setattr__, qui appelle de nouveau __setattr__ et ainsi de suite. Comment dois-je changer ce code, qui, dans ce cas, un nouvel attribut x de self est créé, le maintien de la valeur 1?

Ou est-il une meilleure façon de gérer les appels comme instance.device.read être 'lié' à instance.read?

Il y a toujours des questions sur le pourquoi: j'ai besoin de créer des abstractions de xmlrpc appels, pour lesquels très facile de méthodes comme le myxmlrpc.instance,device.read et similaires peuvent être créés. J'ai besoin de "se moquer de" ce jusqu'à mimer ces multi-dot-appels de méthode.

  • ce cas d'utilisation serait plus facilement résolu en utilisant @property
InformationsquelleAutor Alex | 2013-06-10