考虑以下代码:Python:在您定义函数__setattr__的方式中不一致?
class Foo1(dict):
def __getattr__(self, key): return self[key]
def __setattr__(self, key, value): self[key] = value
class Foo2(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
o1 = Foo1()
o1.x = 42
print(o1, o1.x)
o2 = Foo2()
o2.x = 42
print(o2, o2.x)
我希望相同的输出。然而,与CPython的2.5,2.6(类似3.2)我得到:
({'x': 42}, 42)
({}, 42)
随着PyPy 1.5.0,我得到预期的输出:
({'x': 42}, 42)
({'x': 42}, 42)
这是 “正确” 的输出? (或者应该是什么输出根据Python文档?)
Here是CPython的错误报告。
有趣的谜题。我想知道CPython的行为与'dict .__ setitem__'是一个* slot wrapper *有什么关系。 – NPE 2011-06-10 11:05:43