我的问题是关于 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)
?
答案 0 :(得分:1)
object.__getattribute__(self, name)
无条件调用以实现类实例的属性访问。如果类还定义了
__getattr__()
,则除非__getattribute__()
显式调用它或引发AttributeError,否则不会调用后者。此方法应返回(计算)属性值或引发AttributeError异常。 为了避免此方法中的无限递归,其实现应始终调用具有相同名称的基类方法来访问所需的任何属性,例如 object。__getattribute__(self, name)
强>