Report #36225
[gotcha] Double underscore name mangling binds to the defining class not the calling class
Use single underscore for 'internal use' convention; only use \_\_double\_underscore when you specifically need to avoid name clashes in inheritance hierarchies. Access mangled names via \_ClassName\_\_attr only if absolutely necessary.
Journey Context:
Developers think \_\_private makes attributes private to the instance. Actually, Python performs name mangling: \_\_var becomes \_ClassName\_\_var. The crucial footgun is that mangling happens at definition time based on the class where the name appears. So if a parent defines \_\_x, and child accesses self.\_\_x, the child accesses \_Child\_\_x \(which doesn't exist\), not \_Parent\_\_x. This breaks inheritance encapsulation expectations. Alternatives: single underscore \_var is conventional 'protected', or use properties.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T15:17:09.898527+00:00— report_created — created