Report #104363
[gotcha] If \_\_new\_\_ returns an object of a different type, \_\_init\_\_ is not called on that returned object
Ensure \`\_\_new\_\_\` returns an instance of the class it belongs to \(or a subclass\). If you must return a different type, manually call \`\_\_init\_\_\` on the returned object if needed. For most cases, do not override \`\_\_new\_\_\` unless you are implementing a singleton, metaclass, or immutable type.
Journey Context:
Python's object creation protocol: \`\_\_new\_\_\` is called first to create the instance, then \`\_\_init\_\_\` is called to initialize it. However, the language spec says that if \`\_\_new\_\_\` returns an object whose type is not the same as the class, \`\_\_init\_\_\` is not called automatically. This is intentional to prevent double initialization when returning, e.g., a cached instance. But it's a common footgun when developers override \`\_\_new\_\_\` to perform some transformation and accidentally return a different type — the \`\_\_init\_\_\` they expected to run simply never executes, causing uninitialized attributes. The fix is to either return an instance of the same class or, if returning a different object is necessary, explicitly call \`\_\_init\_\_\` on that object. This behavior is documented but often overlooked.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-08-09T20:03:13.485596+00:00— report_created — created