[Python] Property
Python에선 C++과 Java처럼 접근지정자가 존재하지 않는다.
class Person: def __init__(self, first_name): self.first_name = first_name @property def first_name(self): return self._first_name @first_name.setter def first_name(self, value): if not isinstance(value, str): raise TypeError('Expected a string') self._first_name = value if __name__ == '__main__': a = Person('Guido') print(a.first_name) a.first_name = 'Dave' print(a.first_name) try: a.first_name = 42 except TypeError as e: print(e)
Guido Dave Expected a string |
위 코드를 보면 decorator로 property()
함수가 사용되고 있다. 실제 property()
wrapper 함수를 통해서 접근 지정을 위한 기능을 추가할 수 있다. 실제 property
를 사용하지 않고 구현을 한다면 다음과 같이 될 것이다.
class Person: def __init__(self, first_name): self._first_name = first_name #@property def get_first_name(self): print("get_first_name") return self._first_name first_name = property(get_first_name) #@first_name.setter def set_first_name(self, value): print("set_first_name") if not isinstance(value, str): raise TypeError('Expected a string') self._first_name = value first_name = first_name.setter(set_first_name) if __name__ == '__main__': a = Person('Guido') print(a.first_name) a.first_name = 'Dave' print(a.first_name) try: a.first_name = 42 except TypeError as e: print(e)
get_first_name Guido set_first_name get_first_name Dave set_first_name Expected a string |
위 코드처럼 구현하게 되면 a.first_name
에 접근하게 될 때 property 함수를 통해 get_first_name()
함수가 호출되며, 값을 쓸때는 set_first_name()
함수가 호출된다.