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.