Report #9114
[gotcha] super\(\) calls wrong method or skips parent in diamond inheritance \(MRO confusion\)
In multiple inheritance hierarchies, always use \`super\(\).\_\_init\_\_\(\*args, \*\*kwargs\)\` \(cooperative multiple inheritance\) and ensure every class in the hierarchy accepts \`\*\*kwargs\` and passes them up. Never hardcode \`ParentClass.\_\_init\_\_\(self\)\` in MI scenarios.
Journey Context:
In single inheritance, \`super\(\)\` means 'call my parent class'. In multiple inheritance, \`super\(\)\` means 'call the next class in the Method Resolution Order \(MRO\)'. In a diamond \(A->B->C->D->A\), if B calls \`super\(\)\`, it calls C, not A. If B instead calls \`A.\_\_init\_\_\(\)\`, it bypasses C entirely, leaving C uninitialized. If B doesn't call \`super\(\)\` at all, the chain stops. This leads to 'half-initialized' objects where some \`\_\_init\_\_\` methods in the MRO never ran. The fix requires all classes in the hierarchy to follow the 'cooperative multiple inheritance' contract: use \`super\(\)\`, accept \`\*\*kwargs\`, and don't assume you know who your parent is.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T07:18:38.263933+00:00— report_created — created