728x90
반응형
파이썬에 익숙해지기 위해 연습차 클래스로 자판기를 만들어보았습니다.
R은 통계를 위한 언어인 반면 파이썬은 다양한 목적을 위해 사용될 수 있어서 프로그래밍 관련된 기본 지식이 조금 더 필요한 것 같은 인상을 받았습니다.
class bev:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def __str__(self):
return self.name + ' - ' + str(self.price) + 'won - ' + str(self.stock) + 'ea'
def __repr__(self):
return str(self)
# 관리자 기능 클래스
# 관리자용 기능을 사용하기 위해서는 자동판매기 클래스 생성시 지정하는 관리자용 비밀번호를 입력받습니다.
# 사용자 편의를 위해 표시 및 입력받는 인덱스는 1부터 시작하도록 하였습니다.
class ft_admin(object):
# 음료 추가 기능
# 이름, 가격, 재고, 비밀번호를 입력받고 추가된 상품 정보를 출력합니다.
def add_bev(self, name, price, stock, password):
if self.password != password:
print('Incorrect Password')
else:
new_bev = bev(name, price, stock)
self.bevs.append(new_bev)
print(new_bev.name + ' added ' + str(new_bev.stock) + 'ea')
# 음료 삭제 기능
# 인덱스를 입력받아 해당 상품을 삭제합니다.
# 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
def remove_bev(self, password):
if self.password != password:
print('Incorrect Password')
else:
try:
del_index = int(input('Input item number : ')) - 1
if del_index < len(self.bevs) and del_index >= 0:
print(str(self.bevs[del_index]) + ' Deleted')
del self.bevs[del_index]
else:
print('Entered Index does not exist. Check the list')
self.view_list()
except(ValueError):
print('Invalid Input')
# 재고 조정 기능
# 인덱스와 조절할 재고량을 입력받아 재고를 수정합니다.
# 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
def restock_bev(self, password):
if self.password != password:
print('Incorrect Password')
else:
try:
selected_index = int(input('Input item index number : ')) - 1
if selected_index < len(self.bevs) and selected_index >= 0:
restock_amount = int(input('How many do you restock? : '))
self.bevs[selected_index].stock += restock_amount
print(self.bevs[selected_index].name + ' restocked ' + str(restock_amount) + 'ea')
else:
print('Entered index does not exist. Check the list')
self.view_list()
except(ValueError):
print('Invalid Input')
# 음료 정보 변경 기능(이름, 가격, 재고)
# 인덱스와 변경할 항목명, 변경할 값을 입력받아 정보를 수정합니다.
# 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
# 항목명을 잘못 입력한 경우 오류 메시지를 출력합니다.
def update_bev(self, password):
if self.password != password:
print('Incorrect Password')
else:
try:
selected_index = int(input('Input item index number : ')) - 1
if selected_index < len(self.bevs) and selected_index >= 0:
update_obj = input('What do you want to change? (name / price / stock): ')
if update_obj == 'name':
update_val = input( update_obj + ' to? : ')
print(self.bevs[selected_index].name + ' updated to ' + update_val)
self.bevs[selected_index].name = update_val
elif update_obj == 'price':
update_val = int(input(update_obj + ' to? : '))
print(str(self.bevs[selected_index].price) + ' updated to ' + str(update_val))
self.bevs[selected_index].price = update_val
elif update_obj == 'stock':
update_val = int(input(update_obj + ' to? : '))
print(str(self.bevs[selected_index].stock) + ' updated to '+ str(update_val))
self.bevs[selected_index].stock = update_val
else:
print('There is no such value')
else:
print('Entered index does not exist. Check the list')
self.view_list()
except(ValueError):
print('Invalid Input')
# 순서 변경 기능
# 서로 위치를 바꿀 항목의 인덱스를 입력 받아 변경합니다.
def swap_bev(self, password):
if self.password != password:
print('Incorrect Password')
else:
try:
self.view_list()
first_index = int(input('Input 1st index : ')) - 1
second_index = int(input('Input 2nd index : ')) - 1
print(self.bevs[first_index].name + ' and ' + self.bevs[second_index].name + ' swapped')
self.bevs[first_index], self.bevs[second_index] = self.bevs[second_index], self.bevs[first_index]
self.view_list()
except(ValueError):
print('Invalid Input')
# 매출 확인 기능
# 발생한 거래 수, 매출액, 상품별 판매 내역을 출력합니다.
# 원하는 경우 판매 내역을 초기화합니다.
def sales_check(self, password):
if self.password != password:
print('Incorrect Password')
else:
print('Transaction : ' + str(self.purchases))
print('Sales : ' + str(self.sales))
sales_info = '\n' + '***Details***' + '\n'
for m in self.sales_list:
index_no = self.sales_list.index(m) + 1
sales_info += 'No. ' + str(index_no) + ' : ' + str(m) + '\n'
print(sales_info)
try:
q_init = input('Initiate sales? (Y/N) : ')
if q_init == 'y' or q_init == 'Y':
self.purchases = 0
self.sales = 0
self.sales_list = []
print('Sales initiated')
except(ValueError):
print('Invalid Input')
# 고객용 기능 클래스
class ft_customer(object):
# 판매 중인 목록 표시 기능
def view_list(self):
info = '\n' + '***Beverage List***' + '\n'
for i in self.bevs:
index_no = self.bevs.index(i) + 1
info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
print(info)
# 음료 선택하여 장바구니로 보내는 기능
# 인덱스와 수량을 입력받아 장바구니에 해당 상품과 수량를 추가한 후 장바구니를 출력합니다.
# 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
# 보유한 재고보다 큰 수량을 입력한 경우 오류 메시지를 출력합니다.
# 이미 장바구니에 있는 상품을 추가로 선택한 경우 장바구니에 재고만 추가합니다.
def select_bev(self):
global bev
try:
selected_index = int(input('Input item index number : ')) - 1
if selected_index < len(self.bevs) and selected_index >= 0:
cart_amount = int(input('How many do you need? : '))
if cart_amount <= self.bevs[selected_index].stock:
print('\n' + str(self.bevs[selected_index].name) + ' Added to cart ' + str(cart_amount) + 'ea')
self.bevs[selected_index].stock -= cart_amount
if self.cart == []:
cart_bev = bev(self.bevs[selected_index].name, self.bevs[selected_index].price, cart_amount)
self.cart.append(cart_bev)
else:
for i in self.cart:
self.name_list.append(i.name)
if self.bevs[selected_index].name in self.name_list:
for i in self.cart:
if i.name == self.bevs[selected_index].name:
i.stock += cart_amount
else:
cart_bev = bev(self.bevs[selected_index].name, self.bevs[selected_index].price, cart_amount)
self.cart.append(cart_bev)
self.name_list = []
cart_info = '\n' + '***Your cart***' + '\n'
self.total_amount = 0
for i in self.cart:
index_no = self.cart.index(i) + 1
cart_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
self.total_amount += i.price * i.stock
print(cart_info)
print('Your Total amount : ' + str(self.total_amount) + 'won')
q_next = input('Proceed to payment or select more?(P:payment, S:select, Q: quit) : ')
if q_next == 'P' or q_next == 'p':
self.payment()
elif q_next == 'S' or q_next == 's':
self.select_bev()
else:
print('End Selecting')
else:
print('We do not have enough stock. Check the list')
self.view_list()
else:
print('Entered Index does not exist')
except(ValueError):
print('Invalid Input')
# 결제 기능
# 결제를 위해 우선 장바구니 내역을 보여주고 지불액을 입력받습니다.
# 총 결제 금액 이상으로 지불한 경우 영수증, 거스름돈을 출력하고 거래 수, 매출, 판매 내역을 추가하고 장바구니를 비웁니다.
# 총 결제 금액 미만으로 지불한 경우 입력받은 결제액 값을 0으로 되돌리고 오류 문구를 출력합니다.
def payment(self):
self.view_cart()
try:
paid = input('Please input the cash : ')
if int(paid) >= self.total_amount:
receipt_info = '\n' + '***Your receipe***' + '\n'
for i in self.cart:
index_no = self.cart.index(i) + 1
receipt_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
print(receipt_info)
print('You paid ' + str(paid) + 'won')
print('Your Total amount : ' + str(self.total_amount) + 'won')
print('Your change : ' + str(int(paid) - self.total_amount) + 'won')
print('Have a nice day!')
self.sales += self.total_amount
self.purchases += 1
for j in self.sales_list:
self.name_list.append(j.name)
for k in self.cart:
if k.name in self.name_list:
for l in self.sales_list:
if k.name == j.name:
j.stock += k.stock
else:
self.sales_list.append(k)
name_list = []
paid = 0
self.cart = []
self.total_amount = 0
else:
print('You have to pay more. Try again.')
paid = 0
except(ValueError):
print('Invalid Input')
# 장바구니 확인
def view_cart(self):
cart_info = '\n' + '***Your cart***' + '\n'
for i in self.cart:
index_no = self.cart.index(i) + 1
cart_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
print(cart_info)
print('Your Total amount : ' + str(self.total_amount) + 'won')
# 장바구니 비우기
def cart_init(self):
for i in self.cart:
for j in self.bevs:
if i.name == j.name:
j.stock += i.stock
self.cart = []
self.total_amount = 0
print('Cart is empty now')
# 자동판매기 클래스
# 관리자용 기능과 고객용 기능 클래스를 상속받습니다.
class vm(ft_admin, ft_customer):
def __init__(self, password):
self.sales = 0
self.password = password
self.bevs = []
self.cart = []
self.total_amount = 0
self.purchases = 0
self.sales_list = []
self.name_list = []
# 기능 목록 확인하기
# 관리자 혹은 고객 값을 입력받아 관련 메뉴를 출력합니다.
# 다른 값을 입력한 경우 오류메시지를 출력합니다.
def how_to(self):
user = input('Are you an admin or a customer? (Type admin or customer) : ')
if user == 'admin':
print('\n' + '***Functions***' + '\n')
print('Use .add_bev(name, price, stock, password) to add an item')
print('Use .view_list() to check Item list')
print('Use .remove_bev(password) to remove an item')
print('Use .restock_bev(password) to adjust stock')
print('Use .update_bev(password) to update info of an item')
print('Use .swap_bev(password) to swap position')
print('Use .sales_check(password) to check sales status')
elif user == 'customer':
print('\n' + '***Functions***' + '\n')
print('Use .view_list() to check Item list')
print('Use .select_bev() to select an Item')
print('Use .view_cart() to check selected Item list')
print('Use .payment() to pay a bill')
print('Use .cart_init() to empty your cart')
else:
print('You can type only [admin] or [customer]')
728x90
반응형
'데이터 분석 > 파이썬' 카테고리의 다른 글
롤 API 활용 예시(LEAGUE-V4, MATCH-V5) (2) | 2022.06.29 |
---|---|
파이썬으로 영단어 공부하기 (0) | 2022.05.04 |