Data_Analysis_Track_33/Python
Python_05-3(TO DO 정리)
lsc99
2023. 8. 21. 19:40
제품 클래스 구현
속성 : 제품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()