Почему __getattribute__ не работает с некоторыми значениями?

Мой вопрос о getattribute. Пожалуйста, рассмотрите следующий фрагмент кода:

class Product():

  def __init__(self, name, quantity = 1, price =  0.0):
    self.name = name
    self.quantity = quantity
          self.price = price

  def __getattribute__(self, attr):
    if (attr == 'price'):
        return 30 * object.__getattribute__(self, attr)
       #change object.blala-la to the self.name or self.quantity 
    else:
        return object.__getattribute__(self, attr)

tmp = Product("Watermelon", 2, 50.0);
print(tmp.price)`

Я нашел немного вводящим в заблуждение, что если я изменю object.__getattribute__(self, attr) к self.name или же self.quantity я получу 30 раз строку "Арбуз" или 60.0 (в случае self.quantity), но если я положу туда self.price я получу RuntimeError, что-то о максимальной глубине рекурсии.

Итак, вопрос: почему я не могу сделать это с self.price и просто напиши вместо object.__getattribute__(self, attr)?

1 ответ

Документация гласит:

object.__getattribute__(self, name)

Вызывается безоговорочно для реализации доступа к атрибутам для экземпляров класса. Если класс также определяет __getattr__(), последний не будет называться, если __getattribute__() либо вызывает его явно, либо вызывает AttributeError. Этот метод должен возвращать (вычисленное) значение атрибута или вызывать исключение AttributeError. Чтобы избежать бесконечной рекурсии в этом методе, его реализация всегда должна вызывать метод базового класса с тем же именем для доступа к любым необходимым ему атрибутам, например, объекту.__getattribute__(self, name),

Другие вопросы по тегам