为什么__getattribute__不能使用某些值?

时间:2017-04-18 08:18:44

标签: python class oop 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.nameself.quantity我将获得30次字符串"西瓜"或60.0(如果是self.quantity),但是如果我放在那里self.price我会得到RuntimeError,这是关于最大递归深度的。

所以,问题:为什么我不能用self.price执行此操作而只是写object.__getattribute__(self, attr)

1 个答案:

答案 0 :(得分:1)

documentaion says

  

object.__getattribute__(self, name)

     

无条件调用以实现类实例的属性访问。如果类还定义了__getattr__(),则除非__getattribute__()显式调用它或引发AttributeError,否则不会调用后者。此方法应返回(计算)属性值或引发AttributeError异常。 为了避免此方法中的无限递归,其实现应始终调用具有相同名称的基类方法来访问所需的任何属性,例如 object。__getattribute__(self, name)