property와 디스크립터 이해하기property 이해하기property는 클래스 내부에서 캡슐화된 변수에 대해 getter, setter, deleter를 제공하는 Python 내장 기능입니다.
property(getter, setter) 형태로 클래스 변수로 선언.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 호출
@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 호출
__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__ 호출
num: int = 3 # num은 정수형임을 명시
property는 캡슐화를 위해 getter, setter를 간편하게 관리할 수 있는 기능이다.@property는 속성 접근자 메서드를 정의하는 데코레이터이다.__get__, __set__, __delete__)는 속성의 동작을 세밀하게 제어할 수 있다.