2.20. 클래스 기초

클래스 는 데이터와 그 데이터에 작용하는 함수들을 하나의 이름 아래에 묶습니다. 여러 상태 조각이 함께 속하고 스크립트의 대부분 함수가 그 동일한 값 집합을 인수로 받을 때 클래스를 사용하는 것이 가치가 있습니다.

2.20.1. class 키워드

키워드는 class 입니다. 본문에는 새 인스턴스가 생성될 때마다 실행되는 __init__ 메서드가 들어 있습니다:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(3, 4)
print(p.x, p.y)

출력:

3 4

Point 는 클래스이고, p 는 그것의 인스턴스 입니다. 호출 Point(3, 4) 의 괄호는 __init__ 를 호출하며, 이는 인수를 새 인스턴스의 속성에 할당합니다. self 는 인스턴스를 가리키는 관례적인 이름입니다. self.x 는 인스턴스의 나머지 메서드들이 읽게 될 속성을 설정합니다.

2.20.2. 언제 클래스를 사용할까

다음 조건들이 동시에 참일 때 클래스를 사용하세요:

  • 관련된 몇 개의 값이 어디서나 함께 다닙니다(점의 xy; 센서 측정값의 값, 단위, 타임스탬프).

  • 여러 함수가 그 동일한 값 집합을 받아 그것들에 대해 작동합니다.

  • 이러한 묶음을 한 번에 두 개 이상, 서로 구별되게 유지하는 것이 유용합니다.

데이터가 일회성이라면 보통 일반 dicttuple 로 충분합니다. 단일 상수 묶음만 필요하다면 모듈 수준 변수면 됩니다. 클래스는 기본 컨테이너가 아닙니다 – 상태와 동작이 함께 붙어 있고 싶어 할 때 그 자리를 얻습니다.

2.20.3. __init__이 하는 일

__init__ 은 그냥 일반 메서드입니다. 그 안에서 self 에 할당된 모든 것은 새 인스턴스의 속성이 됩니다:

class Sensor:
    def __init__(self, name, unit):
        self.name = name
        self.unit = unit
        self.readings = []

temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)

출력:

temperature C []

readings 는 빈 리스트로 초기화됩니다 – 각 새 인스턴스는 공유되는 것이 아니라 자신만의 리스트를 갖습니다. self 에 할당되지 않은 모든 것은 __init__ 에 대해 지역적이며 반환될 때 사라집니다.