So verwenden Sie __setattr__ richtig und vermeiden eine unendliche Rekursion

Ich möchte eine Klasse definieren, die Folgendes enthältread undwrite Methode, die wie folgt aufgerufen werden kann:

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

Um keine Interlaced - Klassen zu verwenden, bestand meine Idee darin, die zu überschreiben__getattr__ und__setattr__ Methoden und zu überprüfen, ob der angegebene Name istdevice umleiten die Rückkehr zuself. Aber ich stieß auf ein Problem mit unendlichen Rekursionen. Der Beispielcode lautet wie folgt:

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)

Wie in__init__ Der Code hat versucht, ein neues Attribut zu erstellenx, es ruft__setattr__, was wieder anruft__setattr__ und so weiter. Wie muss ich diesen Code ändern, dass in diesem Fall ein neues Attributx vonself erstellt wird, hält den Wert1?

Oder gibt es einen besseren Weg, um Anrufe wie zu behandelninstance.device.read zugeordnet werdeninstance.read?

Da es immer wieder Fragen zum Warum gibt: Ich muss Abstraktionen erstellen vonxmlrpc Anrufe, für die sehr einfache Methoden wiemyxmlrpc.instance,device.read und ähnliches kann erstellt werden. Ich muss das nachahmen, um solche Multi-Dot-Methoden-Aufrufe nachzuahmen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage