Как исправить ошибку чтения атрибута?

class Alpha:
   def __init__(self):
      self.list = [1,2,3]

   def __getattribute__(self, name):
      print(name)
      
   def __setattr__(self, name, txt):
      print(type(txt), name)
      if(name == "list" and type(txt) == list):
         self.__dict__["list"] = []
         for k in txt:
            if(type(k) == str):
               self.__dict__["list"].append(k)
         print("успешно изменено поле, бегом проверять")
      else:
         print("Нельзя устанавливать другие поля или заменять list не списком")

A = Alpha()
A.name = 121
A.list = [1,2,"Слово1", 2, "Слово2"]

При выполнении данного кода возникает ошибка. Тут, как понял, __getattribute__ улавливает изменения над элементами __dict__ и выдает ошибку, но точно не уверен. Подскажите, как ее исправить?


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

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

У вас метод __getattribute__ всегда возвращает значение None. Поэтому при чтении любого атрибута объекта, всегда возвращается None, что приводит к ошибке изменения __dict__. Чтобы это исправить можно добавить вызов базовой реализации метода __getattribute__ (методы __init__ и __setattr__ остаются без изменений - и поэтому не добавил в пример):

class Alpha:

  def __getattribute__(self, name):
    print(name)
    return super().__getattribute__(name)

→ Ссылка