property 데코레이터

2021. 2. 2. 14:19·[Language] - Python

개요


작업을 하던 도중 처음보는 데코레이터를 발견했다.. 보통 우리는 객체의 필드에 직접 접근하는 것을 방지하기 위해 protected나 private 접근제한자를 사용하고, getter와 setter를 통해서만 접근할 수 있도록 캡슐화(Encapsulation)을 한다. 이러한 과정을 간소화 시켜주는 것이 프로퍼티의 역할이다.

 


 

사용 예시


class Palette:
    def __init__(self):
        self.__color = 'blue'
    
    def get_color(self):
        return self.__color

    def set_color(self, color):
        self.__color = color

    def del_color(self):
        del self.__color

    color = property(fget=get_color, fset=set_color, fdel=del_color)


if __name__ == '__main__':
    p1 = Palette()
    print(p1.color) # get_color 호출
    
    p1.color = 'red' # set_color 호출
    print(p1.color) # get_color 호출
    
    del p1.color # del_color 호출
    print(p1.color) # get_color 호출

 

우선 데코레이터를 사용하기 이전에 프로퍼티 객체에 대해 알아보자.

  • 첫 번째 인자(fget)로 getter메소드를 지정할 수 있다. print(p1.color)를 수행할 때, 지정된 getter 메소드(get_color)가 호출된다.
  • 두 번째 인자(fset)로 setter 메소드를 지정할 수 있다. p1.color = 'red'를 수행할 때, 지정된 getter 메소드(set_color)가 호출된다.
  • 마지막 인자(fdel)로 delete 메소드를 지정할 수 있다. 이는 해당 필드가 삭제될 때 호출될 메소드를 지정한다.
$ python t.py
blue
red
Traceback (most recent call last):
  File "/Users/shawn/Documents/Github/strawberry/python-training/t.py", line 25, in <module>
    print(p1.color) # get_color 호출
          ^^^^^^^^
  File "/Users/shawn/Documents/Github/strawberry/python-training/t.py", line 6, in get_color
    return self.__color
           ^^^^^^^^^^^^
AttributeError: 'Palette' object has no attribute '_Palette__color'
  • 실행결과를 보면 del을 통해 해당 필드를 삭제했기 때문에 더 이상 접근할 수 없는 모습을 보여준다.

 

# decorator를 사용한 속성 정의
class PaletteWithDecorator:
	def __init__(self):
		self.__color = 'blue'
	
	@property
	def color(self):
		return self.__color

	@color.setter
	def color(self, color):
		self.__color = color

	@color.deleter
	def color(self):
		del self.__color


if __name__ == '__main__':    
    p2 = PaletteWithDecorator()
    print(p2.color) # get_color 호출

    p2.color = 'green' # set_color 호출
    print(p2.color) # get_color 호출

    del p2.color # del_color 호출
    print(p2.color) # get_color 호출

 

  • @property 데코레이터를 통해서도 간단하게 getter, setter, deleter 정의가 가능하다.
    • 먼저 getter에 대한 @property 데코레이터와 함께 메소드가 정의되어야 한다.
    • getter 역할을 수행하는 메소드명(위 예시에서는 color)을 setter, deleter 역할을 수행하는 메소드의 데코레이터에 명시한다. (@<getter 메소드명>.setter / deleter)

 

'[Language] - Python' 카테고리의 다른 글

[Tip] if문 분기와 삼항연산자가 사용하기 싫을 때  (0) 2021.03.24
zip  (0) 2021.03.24
덕 타이핑 (Duck Typing)  (2) 2020.12.29
추상 베이스 클래스 (Abstract Base Class)  (0) 2020.12.28
pickle 모듈  (0) 2020.12.18
'[Language] - Python' 카테고리의 다른 글
  • [Tip] if문 분기와 삼항연산자가 사용하기 싫을 때
  • zip
  • 덕 타이핑 (Duck Typing)
  • 추상 베이스 클래스 (Abstract Base Class)
Bebsae
Bebsae
  • Bebsae
    뱁새zip
    Bebsae
  • 전체
    오늘
    어제
    • 분류 전체보기 (108)
      • [DevOps] - Kubernetes (5)
      • [DevOps] - AWS (1)
      • [AI] - Machine Learning (19)
      • [AI] - Neural Network (7)
      • [CS] - Network (2)
      • [CS] - Data Structure (3)
      • [CS] - Design Pattern (6)
      • [Language] - Python (15)
      • [Library] - Numpy (7)
        • Quick Start (5)
        • API (2)
      • [Framework] - Django (3)
      • [Framework] - QGIS (6)
      • [Framework] - PyQT (4)
      • [Mathematics] - Linear Alge.. (14)
      • [Mathematics] - Statistical (2)
      • [ETC] - Python (3)
      • [ETC] - C++ (1)
      • [ETC] - Linux (1)
      • 논문 (5)
      • 회고록 (3)
      • 생산성 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    Learning
    decomposition
    numpy
    선형대수
    신경망
    Convolution
    교차검증
    linearalgebra
    algebra
    분해
    파이썬
    MachineLearning
    DEEPLEARNING
    Linear
    Python
    머신러닝
    Machine
    RNN
    QGIS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Bebsae
property 데코레이터
상단으로

티스토리툴바