__getattr__ не создает атрибут, выдает ошибку KeyError

class Mazda:
    
    wheel = "r-17"
    color = "black"
    engine = 2.0
    doors = 4
    gear_box = "manual"   
    
    def __getattribute__(self, value):
        print ("__getattribute__")
        if value == "color":
            return "Отвали"
        else:
            return object.__getattribute__ (self, value)
    
    def __getattr__ (self, value):
        print ("__getattr__")
        self.__dict__[value] == 0
        return 0
    
a = Mazda ()
print (a.lights)

В консоли получаю:

Traceback (most recent call last):
  File "c:\Users\Yegor Tverytinov\Desktop\VSC\Example 2.py", line 28, in <module>
    print (a.lights)
  File "c:\Users\Yegor Tverytinov\Desktop\VSC\Example 2.py", line 23, in __getattr__
    self.__dict__[value] == 0
KeyError: 'lights'

Ответы (1 шт):

Автор решения: CrazyElf

Ошибка здесь:

self.__dict__[value] == 0
                     ^^

Вы вместо присваивания делаете сравнение. А нужно присваивать:

self.__dict__[value] = 0

Для того чтобы сравнить значение происходит ещё раз вызов __getattribute__, но на этот раз без последующего вызова __getattr__, чтобы всё это не зациклилось. Ну и выходит исключение.

→ Ссылка