상속은 파생 클래스가 부모 클래스의 동작을 이어 받고 바꾸는 기능이다. Python은 여러 부모를 가질 수 있고 MRO로 메서드 검색 순서를 정한다.

class Engine:
    def choose(self, board):
        ...

class Game:
    def __init__(self, engine: Engine) -> None:
        self.engine = engine

`super()`는 무조건 직계 부모를 부르는 문법이 아니라 MRO의 다음 구현을 부른다. 여러 상속에서 협력하려면 각 구현이 같은 시그니처로 super를 호출해야 한다. 한 클래스가 중간에서 호출을 끊으면 뒤 클래스는 실행되지 않는다.

덕 타이핑에서는 상속하지 않아도 필요한 메서드를 제공하면 사용할 수 있다. 이를 정적 타입으로 표현하는 도구가 19편의 Protocol이다.

`isinstance` 분기가 계속 늘어난다면 다형성이나 함수 테이블로 동작을 객체 쪽에 옮길 기회인지 살핀다.

Python 15. 상속보다 조합의 핵심 흐름도
그림. 코드 재사용만 필요하면 상속보다 조합이 결합을 줄인다.