class 문
class 문이 클래스 객체 만들고 (Python 의 모든 거처럼 자체가 값) 이름에 바인딩. 본문 안에 메서드 (self 첫 인자로 받는 함수) 와 클래스 레벨 속성 정의. 클래스 호출 (Circle(3)) 하면 인스턴스 생성.
__init__ — 생성자가 아니라 후처리 setup
__init__ 은 엄밀히 말하면 생성자가 아니야. 진짜 생성자는 __new__ — 빈 인스턴스 생성. __init__ 은 그 직후 도는 setup hook — 새 인스턴스의 속성 채움. __new__ override 는 특수 경우 (싱글톤, immutable 서브클래스) 만 — 99% 는 __init__.
self — 관습상 인스턴스
모든 인스턴스 메서드의 첫 인자가 self. obj.method(...) 호출하면 Python 이 인스턴스 자동으로 넘김. self 라는 이름은 키워드 X — 다른 이름 가능 — 근데 모든 Python 개발자가 self 기대. 다른 이름 쓰면 다음 독자가 멈춰서 찡그려. 싸우지 마.
메서드 호출 — bound vs unbound
obj.method 접근하면 Python 이 *bound 메서드* 반환 — 인스턴스에 이미 연결된 호출 가능. obj.method(x) 가 작동하는 건 self 가 자동 채워지기 때문. Circle.area(c) 직접 호출도 작동 — unbound (정확히는 클래스의 함수) 형태, 인스턴스 명시적으로 넘김. bound 형태가 일상 작성용.
원칙: 클래스 = 청사진, 인스턴스 = 거기서 만든 거. 클래스 레벨 state 는 클래스 자체에, 인스턴스 레벨 state 는 각 인스턴스에. 둘 헷갈리면 "왜 list 가 인스턴스 간에 계속 자라" 부류 버그 — 다음 lesson 에서.