[Python] Class - getter, setter

1 minute read

python-version-3.7.1

Class - getter, setter

Example

class MakeCh:
    ch_num = 0
    
    def __init__(self, name):
        MakeCh.ch_num += 1
        self.__num = MakeCh.ch_num  # __ 를 통해 Name Mangling
        self.__name = name  # __ 를 통해 Name Mangling

[Python] Class - Mangling 에서 다루었던 예제코드이다.
위 코드에는 설명했던대로, __(double underscore)를 통해 Mangling 을 하였다.
즉 인스턴스를 생성 후, numname 은 해당 단순하게는 접근 불가능하다. (Mangling 된 이름으로 직접 접근 가능)

해당변수들은 self._ClassName__VariableName로 Mangling 된 것을 알 수 있다.
self._ClassName__VariableName 을 호출 및 할당할 경우 직접 접근가능하다.
하지만 이러한 접근법은 지양하는 것이 좋다.

  • dir() 메서드를 해당 인스턴스에 사용해보면 self._ClassName__VariableName 를 확인 가능하다.



ch_first = MakeCh('first')  # 인스턴스 생성
ch_first.__num

>>> AttributeError

ch_first.__name

>>> AttributeError

Mangling 된 이름을 직접 접근하는 것이 아닌,
변수에 접근하는 방법은 아래의 두가지를 클래스내부에 만드는 것이다.

  • 접근자(getter): Mangling 된 값에 접근을 할 수 있도록 해주는 메서드
  • 설정자(setter): Mangling 된 값에 접근하여 수정할 수 있도록 해주는 메서드
class MakeCh:
    ch_num = 0
    
    def __init__(self, name):
        MakeCh.ch_num += 1
        self.__num = MakeCh.ch_num
        self.__name = name
        
    def get_num(self):  # num 의 getter(접근자)
        return self.__num
        
    def set_num(self, num):  # num 의 setter(설정자)
        self.__num = num
        
    def get_name(self):  # name 의 getter(접근자)
        return self.__name
        
    def set_name(self, name):  # name 의 setter(설정자)
        self.__name = name

클래스 내부에 접근자와 설정자 메서드를 작성하였다.
이제 작성된 메서드를 통해 Mangling 된 변수에 접근해보겠다.

ch_first = MakeCh('first')  # 인스턴스 생성
ch_first.get_num()  # 접근자를 통하여 __num 에 접근

>>> 1

인스턴스 변수 __num 값에 접근자를 통하여 접근하였다.

ch_first.get_name()  # 접근자를 통하여 __name 에 접근

>>> 'first'

인스턴스 변수 __name 값에 접근자를 통하여 접근하였다.
이번엔 설정자를 통해 변수들의 값을 변경해보겠다.

ch_first.set_num(777)  # 설정자를 통하여 __num 값 777로 변경
ch_first.set_name('Awesome')  # 설정자를 통하여 __name 값 'Awesome' 으로 변경

이제 값이 변경되었는지 접근자를 통해 결과값을 확인해보겠다.

ch_first.get_num()

>>> 777

인스턴스 변수 __num 값에 생성자를 통하여 값을 변경하는 것에 성공하였다.

ch_first.get_name()

>>> 'Awesome'

인스턴스 변수 __name 값에 생성자를 통하여 값을 변경하는 것에 성공하였다.

getter, setter를 통해서 Mangling 된 값에 접근하거나 값을 변경이 가능하며, getter, setter 메서드를 통해서만 접근가능하게 하여 예외처리 및 특정 로직을 설정할 수 있게된다.

이렇게 직접 getter, setter를 구현할 수도 있지만, python 에서는 @property, @{name}.setter을 활용하여 구현할 수 있다.
해당 내용은 [Python] Class - @property / @name.setter 참고

Leave a comment