본문 바로가기

About/Python

[Python] 프로퍼티(Property)-getter, setter, deleter

프로퍼티(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도 있습니다. deleterdel 문이 실행 시 호출됩니다.


Python의 프로퍼티에 대해 알아보았습니다.