title: Why does __getattribute__ not work with some values?
body: <p>my question is about <code>__getattribute__</code>. Please consider the following piece of code:</p>
  <pre><code>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(&quot;Watermelon&quot;, 2, 50.0);
  print(tmp.price)      
  </code></pre>
  <p>I have found a bit misleading that if I change the <code>object.__getattribute__(self, attr)</code> to the <code>self.name</code> or <code>self.quantity</code> i will get 30 times string &quot;Watermelon&quot; or 60.0 (in case self.quantity), but if i put there <code>self.price</code> i will get <code>RuntimeError</code>, something about max recursion depth.</p>
  <p>So, question: Why I cannot do that with <code>self.price</code> and just write instead <code>object.__getattribute__(self, attr)</code>?</p>