Я хочу определить класс, содержащий read и write метод, который можно вызвать следующим образом:
instance.read
instance.write
instance.device.read
instance.device.write
Чтобы не использовать чересстрочные классы, моя идея заключалась в том, чтобы перезаписать методы __getattr__ и __setattr__ и проверить, если данное имя device перенаправляет возврат на self. Но я столкнулся с проблемой, дающей бесконечные рекурсии. Код примера выглядит следующим образом:
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)
Как и в __init__, код попытался создать новый атрибут x, он вызывает __setattr__, который снова вызывает __setattr__ и так далее. Как мне изменить этот код, в этом случае создается новый атрибут x из self, удерживая значение 1?
Или есть ли лучший способ обрабатывать вызовы, такие как instance.device.read, для "сопоставления" с instance.read?
Как всегда есть вопросы о том, почему: мне нужно создать абстракции вызовов xmlrpc, для которых могут быть созданы очень простые методы вроде myxmlrpc.instance,device.read и аналогичные. Мне нужно "имитировать" это, чтобы имитировать такие вызовы с несколькими точками.