[Python] property와 디스크립터 이해하기-2025-01-21

정지은·2025년 1월 21일
0

나머지공부

목록 보기
4/17

Python: property와 디스크립터 이해하기

1. property 이해하기

property는 클래스 내부에서 캡슐화된 변수에 대해 getter, setter, deleter를 제공하는 Python 내장 기능입니다.

기본 사용법

  1. 직접 property 생성
    • property(getter, setter) 형태로 클래스 변수로 선언.
  2. 예제 코드
class Natural:
    def __init__(self, n):
        self.__n = max(n, 0)

    def getn(self):
        return self.__n

    def setn(self, n):
        self.__n = max(n, 1)

    p = property(getn, setn)  # p가 property로 동작

n1 = Natural(1)
print(n1.p)  # getter 호출
n1.p = 5     # setter 호출

2. @property 데코레이터

@property 데코레이터를 사용하면, getter와 setter를 더 간단하게 정의할 수 있다.

예제 코드

class Car:
    def __init__(self, initial_speed):
        self._speed = initial_speed

    @property
    def speed(self):
        print('현재 속도 구하기')
        return self._speed

    @speed.setter
    def speed(self, value):
        print('현재 속도 설정하기')
        self._speed = value

    @speed.deleter
    def speed(self):
        print('현재 속도 정보 삭제하기')
        del self._speed

car = Car(50)
print(car.speed)   # getter 호출
car.speed = 100    # setter 호출
del car.speed      # deleter 호출

3. 디스크립터 (__get__, __set__, __delete__)

디스크립터는 속성을 더 세밀하게 제어할 수 있는 Python의 프로토콜입니다.

  • __get__: 속성 조회 시 호출
  • __set__: 속성 값 설정 시 호출
  • __delete__: 속성 삭제 시 호출

예제 코드

class CharacterInfo:
    def __init__(self, power, speed):
        self.power = power
        self.speed = speed

    def __get__(self, obj, objtype):
        print("(GET) 정보 조회됨")
        return f"공격력: {self.power} / 스피드: {self.speed}"

    def __set__(self, obj, val):
        print("(SET) 정보 갱신")
        self.power = val.power
        self.speed = val.speed

    def __delete__(self, obj):
        print("(DELETE) 정보 삭제")
        self.power = None
        self.speed = None

class Guardian:
    info = CharacterInfo(10, "50km/h")

g1 = Guardian()
print(g1.info)   # __get__ 호출
g1.info = CharacterInfo(15, "70km/h")  # __set__ 호출
del g1.info  # __delete__ 호출

4. 타입 어노테이션

  • 변수의 데이터 타입을 명시해 가독성을 높이고 오류를 줄이기 위한 기능
  • 강제성이 없으며, Python은 여전히 동적 타이핑을 유지한다.

예제 코드

num: int = 3  # num은 정수형임을 명시

핵심 요약

  1. property는 캡슐화를 위해 getter, setter를 간편하게 관리할 수 있는 기능이다.
  2. @property는 속성 접근자 메서드를 정의하는 데코레이터이다.
  3. 디스크립터 (__get__, __set__, __delete__)는 속성의 동작을 세밀하게 제어할 수 있다.
  4. 타입 어노테이션은 가독성 및 오류 방지 목적이며 강제성은 없다.

0개의 댓글