看了namedtuple的源码,大概知道是怎么回事了。。。
单看下面这段
for index, name in enumerate(field_names):
try:
itemgetter_object, doc = cache[index]
except KeyError:
itemgetter_object = _itemgetter(index)
doc = f'Alias for field number {index}'
cache[index] = itemgetter_object, doc
class_namespace[name] = property(itemgetter_object, doc=doc)
result = type(typename, (tuple,), class_namespace)
题中p = Point(4, 3, 2)创建时,p.x, p.y和p.z并非实例属性,而是Point中修饰过的property object
大概意思就是求p.x时,该方法继承于Point,调用Point.x,即返回传入p的第0个对象,当Point.x被赋值为8后,p.x的调用仍按此路线走,所以返回了8,造成类属性覆盖实例属性的现象