============================================================
 MULTIPLE INHERITANCE & MRO - Demo Run
============================================================

--- Product combining two mixins ---
  p1.to_json() = {"name": "Widget", "price": 9.99}
  p1 == p2: False
  p1 < p2: True

--- Product's MRO ---
  <class '__main__.Product'>
  <class '__main__.JSONSerializableMixin'>
  <class '__main__.ComparableMixin'>
  <class 'object'>
  Python searches Product -> JSONSerializableMixin -> ComparableMixin -> object
  in that order when looking up a method.

--- Diamond problem ---
  D().greet() = Hello from B
  D's MRO: ['D', 'B', 'C', 'A', 'object']
  D uses B's greet() because B comes before C in D's own base-class list,
  and Python's C3 linearization respects that declared order.

--- Reversing the base-class order changes the result ---
  D2(C, B).greet() = Hello from C  <- now uses C's version instead

============================================================
 Assignment: 3-mixin combination class
============================================================
  [LOG] ThreeMixinCombo: created
  item1.to_json() = {"name": "Item A", "value": 100}
  item1 == item2: False
  item2 < item1: True
  ThreeMixinCombo MRO: ['ThreeMixinCombo', 'LoggableMixin', 'JSONSerializableMixin', 'ComparableMixin', 'object']
