본문 바로가기

Data_Analysis_Track_33/Python

Python_05-3(TO DO 정리)

제품 클래스 구현
속성 : 제품ID:str 제품이름: str, 제품가격:int, 제조사이름:str
  정보은닉에 맞춰서 작성. 값을 대입/조회 하는 것은 변수처리 방식을 할 수 있도록 구현.
메소드: 전체 정보를 출력하는 메소드
메소드 : setter-4개, getter-4개. 전체정보 출력하는 메소드-1개

 

# property() 함수 이용
class Item:
    # attribute 초기화는 initializer에서 한다.
    def __init__(self, item_id, item_name, price, maker):
        # attribute를 외부에서 접근하지 못하게 막는다 -> self.__변수명
        self.__item_id = item_id
        self.__item_name = item_name
        self.__price = price
        self.__maker = maker
        
        
    # itme_id의 getter/setter
    def get_item_id(self):
        return self.__item_id
    def set_item_id(self, new_item_id): # 메소드를 넣는 목적 : 코드 작성이 가능(조건문과 같은 기능 등)
        if new_item_id: # None이 아니면 변경
            self.__item_id = new_item_id
            
    # item_name의 getter/setter
    def get_item_name(self):
        return self.__item_name
    def set_item_name(self, new_item_name):
        if new_item_name:
            self.__item_name = new_item_name
            
    # price의 getter/setter
    def get_price(self):
        return self.__price
    def set_price(self, new_price):
        if new_price > 0:
            self.__price = new_price
            
    # maker의 getter/setter
    def get_maker(self):
        return self.__maker
    def set_maker(self, new_maker):
        if new_maker and len(new_maker) > 2: # 조건 -> 업무적 조건
            self.__maker = new_maker
            
    # 4개 attribute값을 출력하는 메소드
    def print_item_info(self):
        value = f"제품id : {self.__item_id}, 제품명 : {self.__item_name}, 가격 : {self.__price}, 제조사 : {self.__maker}"
        # self.__item_id에서 self.item_id로 바꿔도 결과가 같은데 이유와 차이점은?
        # decorater를 이용하면 함수명 앞에 get과 set이 빠져서 결과값 출력할 때 함수가 실행될 수 있어서? -> 그래서 __쓰는걸 지향한다?
        print(value)
        
    # property 함수를 이용해서 getter/setter들을 변수처럼 호출 할 수 있도록 하기.
    # 호출할 때 사용할 변수명 = property(getter명, setter명)
    item_id = property(get_item_id, set_item_id)
    item_name = property(get_item_name, set_item_name)
    price = property(get_price, set_price)
    maker = property(get_maker, set_maker)

 

i = Item('a10000', 'LG 모니터', 200_000, 'lg')
i.print_item_info()

 

i.item_id = None # 대입(할당) -> property()의 두번째 할당한 메소드를 호출
print(i.item_id) # 조회 -> property()의 첫번째 할당한 메소드를 호출해서 그 반환값을 반환.

 

i.item_name = None
print(i.item_name) # 바뀌지 않는다. 조건에 만족하지 않음.
i.item_name = '삼성모니터'
print(i.item_name)

 

i.price = -3000 
print(i.price) # 바뀌지 않는다. 조건에 만족하지 않음
i.price = 1500
print(i.price)

 

i.maker = '아' # 바뀌지 않는다. 조건에 만족하지 않음
print(i.maker)
i.maker = '삼성전자'
print(i.maker)

 

i.print_item_info()

 

# property() 함수 이용
class Item2:
    # attribute 초기화는 initializer에서 한다.
    def __init__(self, item_id, item_name, price, maker):
        # attribute를 외부에서 접근하지 못하게 막는다 -> self.__변수명
        self.__item_id = item_id
        self.__item_name = item_name
        self.__price = price
        self.__maker = maker
        
    # itme_id의 getter/setter
    # 메소드의 이름을 호출할 때 사용할 변수형태로 지정
    # 순서 : getter를 정의하고 그 다음에 setter 정의
    # getter : @property 데코레이터를 선언
    @property
    def item_id(self):
        print('Item2.get_item_id()')
        return self.__item_id
    
    # setter : @getter메소드이름.setter
    @item_id.setter
    def item_id(self, new_item_id): # 메소드를 넣는 목적 : 코드 작성이 가능(조건문과 같은 기능 등)
        print('Item2.set_item_id()')
        if new_item_id: # None이 아니면 변경
            self.__item_id = new_item_id
            
    # item_name의 getter/setter
    @property
    def item_name(self):
        return self.__item_name
    @item_name.setter
    def item_name(self, new_item_name):
        if new_item_name:
            self.__item_name = new_item_name
            
    # price의 getter/setter
    @property
    def price(self):
        return self.__price
    @price.setter
    def price(self, new_price):
        if new_price > 0:
            self.__price = new_price
            
    # maker의 getter/setter
    @property
    def maker(self):
        return self.__maker
    @maker.setter
    def maker(self, new_maker):
        if new_maker and len(new_maker) > 2: # 조건 -> 업무적 조건
            self.__maker = new_maker
    
    # 4개 attribute값을 출력하는 메소드
    def print_item_info(self):
        value = f"제품id : {self.__item_id}, 제품명 : {self.__item_name}, 가격 : {self.__price}, 제조사 : {self.__maker}"
        
        print(value)

 

i2 = Item2('c24235', '삼성 노트북', 120_000, '삼성')
i2.print_item_info()

 

i2.item_id = None   # 안되는 조건으로 변수 변경 시도
i2.item_name = None # 안되는 조건으로 변수 변경 시도
i2.price = -200     # 안되는 조건으로 변수 변경 시도
i2.maker = '삼'     # 안되는 조건으로 변수 변경 시도
i2.print_item_info()

 

i2.item_id = 't12434'      # 조건 충족
i2.item_name = 'lg 노트북' # 조건 충족
i2.price = 20000           # 조건 충족
i2.maker = 'lg 전자'       # 안되는 조건으로 변수 변경 시도
i2.print_item_info()