当前位置: 首页 > 面试题库 >

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

沈博涉
2023-03-14
问题内容

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

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

为了不使用隔行扫描类,我的想法是覆盖__getattr____setattr__方法并检查给定名称是否device将return重定向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__,依此类推。我怎么需要更改此代码,即,在这种情况下,一个新的属性xself创建,持有的价值1

还是有更好的方法来处理instance.device.read“映射”到的呼叫instance.read

总是有关于为什么的问题:我需要创建xmlrpc调用的抽象,可以为它们创建非常简单的方法(例如myxmlrpc.instance,device.read,like)。我需要对此进行“模拟”以模仿此类多点方法调用。


问题答案:

您必须调用父类__setattr__方法:

class MyTest(object):

    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name=="device":
            print "device test"
        else:
            super(MyTest, self).__setattr__(name, value)
            # in python3+ you can omit the arguments to super:
            #super().__setattr__(name, value)

关于最佳实践,由于您打算通过使用此方法,因此xml- rpc我认为在_dispatch方法内部最好这样做。

一种快速而肮脏的方法是简单地执行以下操作:

class My(object):
    def __init__(self):
        self.device = self


 类似资料:
  • 问题内容: 我有这样的代码: 实例化B可以按预期工作,但是实例化C无限递归并导致堆栈溢出。我该如何解决? 问题答案: 实例化C调用时,仍然是C,因此super()调用将其带回B。 调用super()时,请直接使用类名。因此,在B中,请致电,而不是(最好在C中使用)。在Python 3中,您可以仅使用不带参数的super()来实现同一目的

  • 我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看

  • 问题内容: 我正在编写一个函数,该函数最多可以调用5000次。当然,我得到了。有什么办法可以以一种非常简单的方式重写此代码?: 顺便说一下,我们可以调用这些函数的深度有什么限制? 问题答案: 使用显式的对象堆栈和循环,而不是调用堆栈和递归:

  • 问题内容: 我在Stack Exchange上的一个问题中看到,限制可能是每15分钟的请求数的函数,并且还取决于算法的复杂性,只不过这并不复杂。 所以我使用这段代码: 我总是收到Twitter限制错误: 问题答案: 问题在于您的区块放置在错误的位置。将数据插入数据库将永远不会产生-对其进行迭代。我建议重构您的代码以在无限循环中调用方法。该调用应放置在块中,因为它可能引发错误。 代码大致如下所示:

  • 问题内容: 这看起来很丑。可选选项的优点在这里完全消失了。我读到应该使用或代替。但是,如果我更换每个吸气剂,真的有好处吗? 与 您知道这里的一些常见或最佳做法吗? 问题答案: 您可以使用 关键是仅在可选函数不为空时才评估映射函数,否则结果将保留为空。如果可选为空,将返回。