Report #17450
[gotcha] Descriptor protocol broken after instance attribute assignment shadows class descriptor
Never assign to an instance attribute that shadows a descriptor \(property, slot, etc.\) on the class. If dynamic values are needed, store them in a private attribute and use the descriptor's getter/setter to access them, or use a different attribute name entirely.
Journey Context:
When you assign \`obj.x = 5\` and \`x\` is a property on the class, Python stores \`x\` in \`obj.\_\_dict\_\_\`, which shadows the descriptor in the class dict. Subsequent accesses of \`obj.x\` bypass the descriptor entirely, returning the raw value from \`\_\_dict\_\_\` without calling the property getter. This is permanent for that instance. People often try to 'cache' values by setting them on the instance inside a property setter, not realizing they've broken the descriptor protocol for that instance. The alternative of using a different internal attribute \(e.g., \`\_x\`\) and keeping the property \`x\` as the only public interface preserves the descriptor contract.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T05:22:52.470412+00:00— report_created — created