Another meaningful consideration is whether or not you intend for the project to remain python for it's full lifecycle.
If you're looking forward to porting to a more performant language, dict has parity with struct, and vtable dereferencing and polymorphism has performance penalties in say, C++. rust and golang don't really have a robust object implementation so flatter structuring is preferred.