파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.
class Counter:
unit = "회" # 클래스 속성: 모든 인스턴스가 공유
def __init__(self, start=0): # 인스턴스 속성 초기화
self.count = start
self.__secret = 42 # 이름 맹글링: _Counter__secret
def inc(self): # 인스턴스 메서드
self.count += 1
@classmethod
def from_str(cls, s): # 대체 생성자. cls = 호출한 클래스
return cls(int(s))
@staticmethod
def is_valid(n): # 인스턴스·클래스와 무관한 함수
return n >= 0객체가 만들어지는 순서
Counter()를 호출하면 먼저 __new__가 인스턴스를 만들고, 이어서 __init__이 그 인스턴스를 초기화한다. __new__는 불변 타입을 상속하거나 인스턴스 생성을 통제할 때만 덮어쓰고, 보통은 __init__만 정의한다.
클래스 속성과 인스턴스 속성
- 클래스 본문에 쓴 속성은 클래스가 정의될 때 한 번 만들어져 모든 인스턴스가 공유한다
self.x = ...로 만든 속성은 인스턴스마다 따로다- 클래스 속성에 리스트 같은 변경 가능한 값을 두면 모든 인스턴스가 같은 리스트를 고치게 된다. 가변 기본 인자 함정와 같은 함정이다
공개와 비공개
파이썬에는 접근 제어 키워드가 없고 이름 관례로 구분한다.
_name: "내부용"이라는 약속. 막지는 않는다__name: 이름 맹글링(name mangling)으로_클래스명__name이 되어 하위 클래스와의 이름 충돌을 피한다. 완전한 비공개는 아니다__name__처럼 앞뒤 밑줄 두 개는 파이썬이 쓰는 특수 메서드(special method, 매직 메서드·dunder method) 이름이다
상속과 포함
- 부모를 적지 않으면
object를 상속한다 - 부모 메서드를 다시 정의하는 것이 오버라이딩(overriding)이고,
super()로 부모 쪽 구현을 부른다(파이썬 MRO와 super()) - 코드 재사용만을 위해서라면 상속보다, 재사용할 객체를 속성으로 갖는 포함(composition, 위임)이 나은 경우가 많다(상속보다 위임)
간단한 데이터 묶음이라면 @dataclass가 __init__·__repr__·__eq__를 만들어 준다. 구현을 강제하는 클래스는 추상 기반 클래스 (ABC), 메서드를 감싸는 문법은 파이썬 데코레이터, 타입스크립트 쪽과 비교하면 TypeScript 클래스 문법를 본다.
출처: Python 튜토리얼: Classes · Class and Instance Variables · Private Variables