본문으로 바로가기

파이썬 getter 와 setter

category 기초지식/파이썬 2018. 12. 31. 15:41

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