노트

파이썬 클래스 기초

Python Classes

CS#python · 연결된 개념 6개

쉽게 말하면

파이썬 클래스는 붕어빵 틀 같아요. 틀을 호출하면 붕어빵인 인스턴스가 나오고, 메서드의 self는 '지금 다루는 이 붕어빵'을 가리켜요. 데이터와 그걸 다루는 함수를 한 묶음으로 관리할 수 있죠.

비유가 깨지는 곳 진짜 붕어빵은 서로 완전히 따로지만, 클래스 본문에 쓴 속성은 한 번 만들어져 모든 인스턴스가 공유해요. 거기에 리스트를 두면 모든 인스턴스가 같은 리스트를 고치게 돼요.

파이썬 클래스는 데이터 속성(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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 기본 컬렉션

    파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.

  • 파이썬 스코프 (LEGB)

    파이썬은 이름을 찾을 때 Local → Enclosing → Global → Built-in 순서로 스코프를 뒤진다. 앞 글자를 따 LEGB(Local, Enclosing, Global, Built-in) 규칙이라 부른다. 함수 안에서 만든 변수는 그 함수 안에서만 살고, 바깥 함수의 변수는 안쪽 함수가 읽을 수 있다.

  • 파이썬 모듈과 패키지

    파이썬에서 .py 파일 하나가 모듈(module)이고, 모듈을 모은 디렉터리가 패키지(package)다. import는 다른 모듈의 변수·함수·클래스에 접근할 수 있게 해 주고, 모듈은 처음 import될 때 한 번만 실행된 뒤 캐시된다(sys.modules).

  • *args·**kwargs와 언패킹

    *args는 남는 위치 인자(positional argument)를 튜플로, **kwargs는 남는 키워드 인자(keyword argument)를 딕셔너리로 모아 받는 문법이다. 반대로 호출할 때 *·**를 쓰면 시퀀스·딕셔너리를 개별 인자로 펼친다. 모으는 것을 패킹(packing), 펼치는 것을 언패킹(unpacking)이라 한다.

  • 매개변수 객체 만들기

    여러 함수에 늘 함께 넘겨지는 값 묶음(데이터 뭉치, Data Clumps)을 하나의 객체로 묶어 넘기는 리팩터링.

보기 옵션