Programming,  Python

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

Leave a Reply

Your email address will not be published. Required fields are marked *