getter 과 setter 을 이해하기 위한 소스코드
- getter, setter 설정 전 기본 개념이해를 위한 소스코드
@property 를 사용하기 전에 get_shop_type(), set_shop_type() 메서드로 각각의 역할을 이해
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 | class Shop: SHOP_TYPE_LIST = ['병원', '패스트푸드', '샌드위치'] def __init__(self, name, shop_type, address): self.name = name self.__shop_type = shop_type self.address = address def show_info(self): return( f'상점정보: {self.name}\n' f'유형: {self.__shop_type}\n' f'주소: {self.address}' ) def get_shop_type(self): return self.__shop_type def set_shop_type(self, new_shop_type): if new_shop_type in SHOP_TYPE_LIST: self.__shop_type = new_shop_type else: print('{} 중에 하나의 유형만 설정 가능합니다.'.format( ', '.join(self.SHOP_TYPE_LIST) )) | cs |
Shop 클래스로 인스턴스 생성하기
- Shop() 객체로 subway 라는 인스턴스 생성 (#1)
- subway.get_shop_type() 으로 shop_type 에 접근 (#2)
get_shop_type 에서 return 되는 결과값을 리턴한다는 의미
- subway.get_shop_type 은 메서드 객체의 메모리 주소이다. (#3)
()괄호없이 호출한다는 것은 return 되는 값이 아닌 get_shop_type 자체에 접근한 것이므로 객체의 메모리 주소만을 가리킴
1 2 3 4 5 6 7 8 | subway = Shop('서브웨이', '패스트푸드', '강남역') #1 subway.get_shop_type() #2 # '패스트푸드' subway.get_shop_type #3 # <bound method Shop.get_shop_type of <__main__.Shop object at 0x108864908>> | cs |
property 로 getter, setter 만들기
property 는 일반적으로 인스턴스 속성에만 접근이 가능하다
property 로 shop_type 에 접근하기
@property 로 접근하면 함수를 불러오는 ()괄호 를 사용하지 않아도 된다.
왜냐하면 shop_type 메서드 자체에 return 되는 값까지 포함하기 때문이다.
(subway.shop_type() 으로 접근하게 되면 str is not callable 이라는 에러를 발생시킨다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 | @property def shop_type(self): return self.__shop_type @shop_type.setter def shop_type(self, new_shop_type): if new_shop_type in self.SHOP_TYPE_LIST: self.__shop_type = new_shop_type else: print('{} 중에 하나이어야 합니다.'.format( ', '.join(self.SHOP_TYPE_LIST) )) | cs |
getter, setter 를 사용한 Shop class 구현
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 | class Shop: SHOP_TYPE_LIST = ['샌드위치', '패스트푸드'] def __init__(self, name, shop_type, address): self.name = name self.__shop_type = shop_type self.address = address def show_info(self): return( f'상점정보: {self.name}\n' f'유형: {self.__shop_type}\n' f'주소: {self.address}' ) @property def shop_type(self): return self.__shop_type @shop_type.setter def shop_type(self, new_shop_type): if new_shop_type in self.SHOP_TYPE_LIST: self.__shop_type = new_shop_type else: print('{} 중에 하나이어야 합니다.'.format( ', '.join(self.SHOP_TYPE_LIST) )) | cs |
getter, setter 사용하기
1 2 3 4 | subway.shop_type = '피씨방' subway.shop_type #패스트푸드 | cs |
한줄요약
- property 를 사용하는 이유는 원래 return 하려는 값을 바로 출력해주는 것
- 특정 함수를 속성처럼 접근(subway.name, subway.address 와 같이 접근)
- property 는 속성처럼 접근하기 때문에 subway.shop_type() 과 같이 접근할 수는 없다.
- 속성은 subway.name으로 접근을 하지 subway.name() 으로 접근하지는 않는다.
- @property 의 shop_type 은 속성이며, @shop_type.setter 은 속성이 아니다.(str)
getter 와 setter 를 사용하는 이유
위의 코드를 보면 SHOP_TYPE_LIST 에 정의한 리스트에 대해서만 setter 속성에서 변경 가능하도록 설정한 것처럼
class 자체에서 정의한 list 에 정의한 값에 한정해서 변경할 수 있도록 하는 것이 setter 함수의 이용 방법이다.
일반적으로 성별, 직업 등과 같이 정해진 카테고리 안에서만 변경이 가능하도록 설정
'기초지식 > 파이썬' 카테고리의 다른 글
isdigit(), isalpha() 함수 (0) | 2019.03.19 |
---|---|
딕셔너리의 get 함수 사용해보기 (0) | 2019.01.14 |
도서관 클래스 (0) | 2019.01.02 |