2016-10-12 1 views
1

У меня есть класс с пользовательским геттером для конкретного ATTR:максимальная глубина рекурсии превысила поглотитель Джанго

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) 

все работает, как я хочу. Wher - моя ошибка в первой части кода?

ответ

3

Потому что __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) 
+0

Я использую объект '.__ GetAttribute __ (самоощущение, '_custom_getter')' вместо 'само .__ ДИКТ __ [ '_ custom_getter'] ', поскольку он генерирует ту же ошибку, но спасибо за статью, я нашел решение Ther. – gargi258