파이썬의 property는 객체 지향 프로그래밍에서 매우 유용하게 사용되는 기능이다. property는 클래스의 속성(attribute)에 접근할 때, 단순한 접근을 넘어 추가적인 처리를 가능하게 해준다. 즉, 속성에 접근할 때마다 특정 메서드를 호출하도록 할 수 있어 속성 값을 읽거나 쓸 때 특정 로직을 실행할 수 있다.
기본 사용법
property 함수는 이를 위해 존재하며, 다음과 같은 네 가지 인자를 받을 수 있다.
fget: 속성 값을 읽을 때 호출되는 함수(getter)fset: 속성 값을 설정할 때 호출되는 함수(setter)fdel: 속성 값을 삭제할 때 호출되는 함수(deleter)doc: 속성에 대한 문서화 문자열
다음 예제를 통해 데코레이터 없이 property를 정의하는 방법을 살펴보자.
class Circle:
def __init__(self, radius):
self._radius = radius
def get_radius(self):
return self._radius
def set_radius(self, value):
if value < 0:
raise ValueError("반지름은 0보다 커야 합니다.")
self._radius = value
def del_radius(self):
del self._radius
radius = property(get_radius, set_radius, del_radius, "원의 반지름을 나타내는 속성")
# 사용 예시
circle = Circle(5)
print(circle.radius) # 5
circle.radius = 10
print(circle.radius) # 10
try:
circle.radius = -3 # ValueError 발생
except ValueError as e:
print(e)
del circle.radius
try:
print(circle.radius) # AttributeError 발생
except AttributeError as e:
print(e)fget: 속성 값을 읽을 때 호출되는 함수. 예제에서는get_radius함수가 해당된다.fset: 속성 값을 설정할 때 호출되는 함수. 예제에서는set_radius함수가 해당된다.fdel: 속성 값을 삭제할 때 호출되는 함수. 예제에서는del_radius함수가 해당된다.doc: 속성에 대한 문서화 문자열. 예제에서는"원의 반지름을 나타내는 속성"가 해당된다.
@property
@property 데코레이터는 메서드를 속성처럼 사용할 수 있게 한다. 이는 getter 메서드를 정의할 때 사용된다.
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value이렇게 하면 value 속성에 접근할 때마다 self._value 값을 반환하는 value 메서드가 호출된다.
@property.setter
@property.setter 데코레이터는 속성에 값을 설정할 때 호출되는 setter 메서드를 정의한다.
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value이렇게 하면 value 속성에 값을 설정할 때 value 메서드가 호출되어 _value 속성 값을 갱신하게 된다.
@property.deleter
@property.deleter 데코레이터는 속성을 삭제할 때 호출되는 deleter 메서드를 정의한다.
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
@value.deleter
def value(self):
del self._value이렇게 하면 value 속성을 삭제할 때 value 메서드가 호출되어 _value 속성을 삭제하게 된다.
응용 예제
이제 property의 좀 더 실용적인 응용 예제를 살펴보자. 예를 들어, 온도를 섭씨와 화씨로 변환하는 클래스를 만들어 보자.
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
self._celsius = value
@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32
@fahrenheit.setter
def fahrenheit(self, value):
self._celsius = (value - 32) * 5/9
# 사용 예시
temp = Temperature(25)
print(temp.celsius) # 25
print(temp.fahrenheit) # 77.0
temp.fahrenheit = 98.6
print(temp.celsius) # 37.0
print(temp.fahrenheit) # 98.6위 예제에서 fahrenheit 속성은 getter와 setter 메서드를 통해 자동으로 섭씨와 화씨 값을 변환해준다. 이처럼 property를 사용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있다.


