[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() 함수가 호출된다.