파이문

파이썬에서의 getter와 setter 본문

Python/Python

파이썬에서의 getter와 setter

민Z 2016. 4. 22. 22:06

파이썬에서의 getter setter


파이썬에서 클래스를 작성하면서 gettersetter를 만든 적이 있다. 아직까지 큰 프로그램(?)을 만들어본 적이 없어서 그냥 돌아가게만 만드는데 중점을 두었었는데, 최근 파이썬을 공부하면서 그것이 올바르지 않은 방법 이란 것을 깨달았다.


그동안 파이썬에서 많은 표준 라이브러리에 대한 함수를 사용하면서 한 번도 getXXX setYYY를 본적이 없었는데 궁금해 하지 않았다는게 스스로 신기할 정도였다.


서론이 길었는데 그렇다면 파이썬에서 기존에 자바처럼 getter와 setter를 사용하려면 어떻게 해야 하는가?


답은 바로 프로퍼티에 있다.

사실, 아직 그렇게 프로퍼티나 데코레이터에 대한 개념이 확립되지는 않았다.

일단 이렇게 작성하는게 옳은 거구나 하는 정도만 보고 넘어가려고 한다. 어차피 공부는 끝이 없으니까.


내용은 이펙티브 파이썬 게터와 세터 메서드 대신에 일반 속성을 사용하자 를 참고하였다.

class MyWallet(object):
    def __init__(self, money):
        self._money = money

    def get_money(self):
        return self._money

    def set_money(self):
        self._money = money

기존에 클래스를 작성하면 보통 함수 앞에 get set을 붙인다. 그러나 이 방법은 파이썬 답지 않는다. 

파이썬에서는 명시적인 게터와 세터를 구현할 일이 거의 없다. 대신 항상 간단한 공개 속성부터 구현하기 시작해야 한다.


나중에 속성을 설정할 때 특별한 동작이 일어나야 하면 @property코레이터와 이에 대응하는 setter 속성을 사용하는 방법으로 바꿀 수 있다.

즉 위의 소스 코드를 다음과 같이 작성한다.

class MyWallet(object):
    def __init__(self, money):
        self._money = money

    @property
    def money(self):
        return self._money

    @money.setter
    def money(self, money):
        self._money = money

이렇게 하면 기존에 money 함수에 인자를 넣으면 세터로, 그냥 호출 하면 게터로 되는 듯 하다. 


참고로 파이썬에서는 캡슐화를 제공하지 않고, 접근 제한자도 없으며 생성자 다형성도 없다.

그래서 클래스에선 무조건 init이 하나만 와야 하고, 비공개 속성을 위해선 변수 혹은 함수 앞에 언더바를 붙여야 하는데 이는 다른 챕터에서 정리해보고자 한다.


어찌되었든 기존에 자바를 생각하고, 자바의 객체지향을 생각한다면 이러한 파이썬의 모습이 생소할 수 있을 것 같다.


Comments