일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Java
- zookeeper
- redis
- golang
- OOM
- go
- 주키퍼
- 튜토리얼
- HBase
- Linux
- 파이썬
- 동적프로그래밍
- boj
- programmers
- 코드워
- docker
- 리눅스
- scala
- 문제풀이
- gradle
- 스칼라
- 프로그래머스
- 자바
- DP
- leetcode
- dynamic programming
- codewars
- Python
- 알고리즘
- Go언어
- Today
- Total
파이문
파이썬에서의 getter와 setter 본문
파이썬에서의 getter와 setter
파이썬에서 클래스를 작성하면서 getter와 setter를 만든 적이 있다. 아직까지 큰 프로그램(?)을 만들어본 적이 없어서 그냥 돌아가게만 만드는데 중점을 두었었는데, 최근 파이썬을 공부하면서 그것이 올바르지 않은 방법 이란 것을 깨달았다.
그동안 파이썬에서 많은 표준 라이브러리에 대한 함수를 사용하면서 한 번도 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이 하나만 와야 하고, 비공개 속성을 위해선 변수 혹은 함수 앞에 언더바를 붙여야 하는데 이는 다른 챕터에서 정리해보고자 한다.
어찌되었든 기존에 자바를 생각하고, 자바의 객체지향을 생각한다면 이러한 파이썬의 모습이 생소할 수 있을 것 같다.
'Python > Python' 카테고리의 다른 글
파이썬 클래스 상속 (0) | 2017.01.16 |
---|---|
파이썬 얕은 복사와 깊은 복사 (0) | 2017.01.09 |
파이썬에서 switch-case문 사용하기 (0) | 2016.05.25 |
파이썬에서 딕셔너리 키 값 체크하기 (1) | 2016.04.22 |
파이썬에서 문자열 합치기 (0) | 2016.04.10 |