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

如何实现__getattribute__而没有无限递归错误?

陆洛城
2023-03-14
问题内容

我想覆盖对类中一个变量的访问,但通常返回所有其他变量。我该怎么做__getattribute__呢?

我尝试了以下操作(它也应说明我要执行的操作),但是出现了递归错误:

class D(object):
    def __init__(self):
        self.test=20
        self.test2=21
    def __getattribute__(self,name):
        if name=='test':
            return 0.
        else:
            return self.__dict__[name]

>>> print D().test
0.0
>>> print D().test2
...
RuntimeError: maximum recursion depth exceeded in cmp

问题答案:

您收到递归错误,因为您尝试访问其中的self.__dict__属性会再次__getattribute__调用您__getattribute__。如果你使用object__getattribute__不是,它的工作原理:

class D(object):
    def __init__(self):
        self.test=20
        self.test2=21
    def __getattribute__(self,name):
        if name=='test':
            return 0.
        else:
            return object.__getattribute__(self, name)

之所以有效,是因为object(在此示例中)是基类。通过调用您的基本版本,__getattribute__可以避免您以前遇到的递归地狱。

IPython的输出与foo.py中的代码:

In [1]: from foo import *

In [2]: d = D()

In [3]: d.test
Out[3]: 0.0

In [4]: d.test2
Out[4]: 21

更新:

在当前文档中,标题为“
针对新样式类的更多属性访问
”的部分中有一些内容,他们建议确切地执行此操作以避免无限递归。



 类似资料:
  • 本文向大家介绍PHP实现递归无限级分类,包括了PHP实现递归无限级分类的使用技巧和注意事项,需要的朋友参考一下 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达

  • 产品类别: 提供程序类: Prices_1类:

  • 本文向大家介绍php实现递归与无限分类的方法,包括了php实现递归与无限分类的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现递归与无限分类的方法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍php无限极分类递归排序实现方法,包括了php无限极分类递归排序实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php无限极分类递归排序实现方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的PHP程序设计有所帮助。

  • 问题内容: 丈夫.java 妻子.java Service.java 当我使用spring数据jpa从数据库中查询丈夫时,结果发生无限递归,参见下图。使用@OneToOne注释时出了什么问题?有人可以给我一些建议吗?或者我以错误的方式使用了注释。 图片 问题答案: 这是一个已知问题,当您具有双向关系时,杰克逊将尝试从另一侧序列化一侧的每个引用,以便逻辑上具有无限递归。 解决方案:有很多解决方案,可

  • 首先,这是我的实体。 玩家: 团队: 正如已经说明的许多主题一样,您可以通过Jackson以多种方式避免WebService中的StackOverflow Exeption。 这很酷,除了JPA之外,在序列化之前,所有的实体都可以无限递归地构造另一个实体。这只是丑陋的ans请求需要更长的时间。检查这个截图:IntelliJ调试器 有办法解决吗?知道我希望根据endpoint获得不同的结果。示例: