파이썬의 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
를 사용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있다.