프로퍼티(property)
- 인스턴스 메서드를 인스턴스 변수와 같이 다룸
프로그램을 작성하다 보면 인스턴스 변수의 값을 사용하거나 확인하고 싶은 경우가 있습니다.
예를들어 전자상거래 프로그램에서 할인을 할 때 할인 후 가격은 원래 가격에서 계산해서 반환해야하며, 할인율(%)에 음숫값이나 100을 넘는 값을 설정했을 때는 에러처리를 해야합니다.
파이썬에서는 이런 요청을 실현하기 위한 구조로서 프로퍼티(property) 를 제공합니다.
다음 코드는 실제 프로퍼티 를 사용한 예제입니다.
class Book:
def __init__(self, raw_price):
if raw_price < 0:
raise ValueError("raw_price must be positive")
self.raw_price = raw_price # 기본값
self._discounts = 0
@property
def discounts(self):
# Book.discounts
return self._discounts
@discounts.setter
def discounts(self, value):
# Book.discounts = 10
if value < 0 or 100 < value:
raise ValueError("discounts must be between 0 and 100")
self._discounts = value
@property
def price(self):
# book.price
multi = 100 - self._discounts
return int(self.raw_price*multi/100)>>> book = Book(2000)
>>> book.discounts # 초기 할인율 0
0
>>> book.price # 초기 가격 2000원
2000
>>> book.discounts = -20 # 할인율 -20% 설정
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 15, in discounts
ValueError: discounts must be between 0 and 100
>>> book.discounts = 20 # 할인율 20% 설정
>>> book.discounts # 할인율 확인
20
>>> book.price # 할인율 적용후 가격
1600
property
- 값을 얻을 때 호출되는 메서드
- 인스턴스 메서드에 @property 데코레이터를 붙이면 그 인스턴스 메서드는 () 를 붙이지 않고도 호출할 수 있습니다.
- @property 가 붙은 메서드는 값을 얻을 때 호출되기 때문에 getter 라고도 불립니다.
- 위의 예시에서 book.discounts 에 접근하면 실제로는 인스턴스 변수 _discounts 에 저장된 값이 반환됩니다.
setter
- 값을 설정할 때 호출되는 메서드
- 메서드 이름은 @property 를 붙인 메서드명(위에서는 discounts)를 그대로 사용해야 합니다.
- 위의 예시에서 할인율을 표현하는 인스턴스 변수 book.discounts 에 음수나 100을 넘는 값이 대입되는 것을 방지합니다.
- 위의 예시에서 @price.setter 가 붙은 인스턴스 메서드 price() 는 정의되어 있지 않으므로 book.price는 값 대입이 불가능합니다.
프로퍼티에는 getter, setter 이외에 deleter라고 불리는 property도 있습니다. deleter 는 del 문이 실행 시 호출됩니다.
Python의 프로퍼티에 대해 알아보았습니다.
'About > Python' 카테고리의 다른 글
[Python] IPython을 사용한 Unix/Linux 셸 명령어 실행 - (IPython.utils.SList에 대하여) (1) | 2022.01.24 |
---|---|
[Programmers] k진수에서 소수 개수 구하기(Python 풀이) - 2022 KAKAO BLIND RECRUITMENT (2) | 2022.01.24 |
[Python] 함수 실행 시간 측정 (Python decorator 활용) (0) | 2021.07.19 |
[Python] Iterable & Iterator (2) | 2021.01.20 |
[Python] Counter (단어 개수 세기) (2) | 2020.12.30 |