【问题标题】:maximum recursion depth exceeded getter Django超过了getter Django的最大递归深度
【发布时间】:2016-10-12 07:43:53
【问题描述】:

我有一些针对特定属性的自定义 getter 类:

class Item(a, b, c, d, models.Model):
     title = Field()
     description = Field()
     a = Field()
     _custom_getter = ['title','description']

     def __getattribute__(self, name):
         if name in self.custom_getter:
             return 'xxx'
         else:
             return super(Item, self).__getattribute__(name)

此代码引发 RunetimeError: maximum recursion depth exceeded while calling a Python object 但是当我使用这段代码时:

class Item(a, b, c, d, models.Model):
    title = Field()
    description = Field()
    a = Field()

    def __getattribute__(self, name):
        custom_getter = ['title','description']
        if name in custom_getter:
            return 'xxx'
        else:
            return super(Item, self).__getattribute__(name)

一切都如我所愿。我在第一段代码中的错误在哪里?

【问题讨论】:

    标签: python django recursion django-models attributes


    【解决方案1】:

    因为__getattribute__ 会在您执行self.custom_getter 时被调用。您可以为此使用self.__dict__。阅读更多How is the __getattribute__ method used?

    class Item(a, b, c, d, models.Model):
         title = Field()
         description = Field()
         a = Field()
         custom_getter = ['title','description']
    
         def __getattribute__(self, name):
             if name in self.__dict__['custom_getter']:
                 return 'xxx'
             else:
                 return super(Item, self).__getattribute__(name)
    

    【讨论】:

    • 我使用object.__getattribute__(self, '_custom_getter') 而不是self.__dict__['_custom_getter'] 因为它会产生同样的错误,但是感谢您的文章,我找到了解决方案。
    猜你喜欢
    • 2013-03-03
    • 2017-08-09
    • 2011-03-31
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多