如何正确使用__setattr__,避免无限递归

13 浏览
0 Comments

如何正确使用__setattr__,避免无限递归

我想定义一个包含readwrite方法的类,可以按照以下方式调用:

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__,依此类推。我需要如何更改此代码,以便在这种情况下,创建一个self的新属性x,其值为1

或者是否有更好的方法来处理类似instance.device.read这样的调用,将其“映射”到instance.read

由于经常有关于为什么的问题:我需要创建xmlrpc调用的抽象,可以创建非常简单的方法,如myxmlrpc.instance,device.read等。我需要“模拟”这个以模仿这样的多点方法调用。

0