Before you can decide "is-a vs has-a", you must already know what a class, an object, a field, a method, inheritance, and delegation actually are — as pictures, not just words. The parent note assumed all of these. We build every one here from nothing.
Look at the figure: the outer box is one object. The top half (pale yellow) is its data — the facts. The bottom half (chalk blue) is its behaviour — the actions. Everything else in this topic is about how these boxes are made and connected.
The def start(self): line defines a button. The self again means "the box this button is on".
The figure shows one Car box with a field slot holding an Engine box inside it, and buttons (start) on the outside. Notice the arrow: pressing the car's button reaches in to the engine box and presses its button. That reaching-in is the next concept.
The . (dot) is the tool that does this. car.start means "the start button belonging to car". self.engine.ignite means "reach into self, grab the engine field, press itsignite". The dot is just "belonging to / go inside".
The parent (or base) class is the old cutter; the child (or subclass) is a modified copy of that cutter that keeps every old button and may add more.
The figure contrasts the two wiring styles side by side:
Left (inheritance): the child box becomes an enlarged copy of the parent — one merged box, buttons inherited, connection frozen at the moment you write the code.
Right (composition): two separate boxes; the outer one merely holds the inner one in a slot and can pop it out and click a new one in.
Read top to bottom: objects give us classes; classes have fields and methods; a field holding an object plus a method delegating to it gives composition; inheritance plus the substitutability rule gives the honest is-a; both feed the final decision this topic is about.