Почему __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)
,