개발자용 표현과 사용자용 표현
__repr__은 디버깅에 유용하고 가능하면 객체를 다시 만들 수 있을 만큼 분명한 표현을, __str__은 사람이 읽기 좋은 표현을 맡아. str이 없으면 repr이 대신 쓰여.
같음과 해시는 함께 설계해
__eq__로 같은 값을 정의했다면 같은 객체끼리는 같은 hash가 나와야 해. 다른 타입과 비교할 수 없으면 False를 확정하지 말고 NotImplemented를 돌려 상대편 비교 기회를 남겨.
값이 바뀌는 객체를 set이나 dict 키로 쓰면 위치를 잃을 수 있으므로 보통 해시 불가로 둬. Python도 __eq__만 재정의하면 __hash__를 None으로 만들어.