ch0nny_log

[빅데이터분석] Python_27. 인스턴스 변수와 클래스 변수 본문

빅데이터 분석(with 아이티윌)/python

[빅데이터분석] Python_27. 인스턴스 변수와 클래스 변수

chonny 2024. 8. 9. 15:10


# Card 클래스 정의
class Card:
    def __init__(self):
        self.money = 0
        self.raise_amount = 1.1
        print('카드가 발급 되었습니다.', self.money, '원이 충전되어 있습니다.')

    def charge(self, num2):
        num = int(num2 * self.raise_amount)  # 충전액을 올림
        self.money += num
        print(num, '원이 충전 되었습니다.')
        print('현재 카드의 충전금액은', self.money, '입니다.')

    def consume(self, num):
        if self.money >= num:
            self.money -= num
            print(num, '원이 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print('현재 잔액은', self.money, '원입니다.')

# 카드 발급 및 충전 확인
card5 = Card()
card5.charge(10000)  # 10000원이 충전될 때, 11000원이 카드에 충전됩니다.​

 

 


# Card 클래스 정의
class Card:
    def __init__(self):
        self.money = 0
        self.raise_amount = 1.1
        print('카드가 발급 되었습니다.', self.money, '원이 충전되어 있습니다.')

    def charge(self, num2):
        num = int(num2 * self.raise_amount)  # 충전액을 올림
        self.money += num
        print(num, '원이 충전 되었습니다.')
        print('현재 카드의 충전금액은', self.money, '입니다.')

    def consume(self, num):
        if self.money >= num:
            self.money -= num
            print(num, '원이 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print('현재 잔액은', self.money, '원입니다.')

# 카드 발급 및 충전 확인
card6 = Card()
card5.raise_amount =1.2
card5.charge(10000)​

설명: 설계도를 무시하고 20% 적립이 되었습니다. (raise_amount를 인스턴트 변수로 만들었기 때문)

class Card:

    raise_amount = 1.1 # 클래스 변수 선언
    def __init__(self):
        self.money = 0
        
        print('카드가 발급 되었습니다.', self.money, '원이 충전되어 있습니다.')

    def charge(self, num2):
        num = int(num2 * Card.raise_amount)  # 충전액을 올림
        self.money += num
        print(num, '원이 충전 되었습니다.')
        print('현재 카드의 충전금액은', self.money, '입니다.')

    def consume(self, num):
        if self.money >= num:
            self.money -= num
            print(num, '원이 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print('현재 잔액은', self.money, '원입니다.')

class VIPCard(Card):
    def __init__(self):
        super().__init__()
        self.raise_amount = 1.2  # VIP 고객은 20% 적립

    def charge(self, num2):
        num = int(num2 * self.raise_amount)  # VIP 적립 비율 적용
        self.money += num
        print(num, '원이 충전 되었습니다.')
        print('현재 카드의 충전금액은', self.money, '입니다.')

# 카드발급
card7 = Card()
card7.raise_amount =1.2
card7.charge(10000) # 10000원이 충전될 때, 11000원이 카드에 충전됩니다.​

 

인스턴스 변수는 함수 변경이 가능한데 클래스 변수는 변경이 안됨.



card8 = Card()
card8.raise_amount = 1.2
card8.charge(10000)

card8 = Card()
Card.raise_amount = 1.2
card8.charge(10000)

#클래스 변수로 클래스를 생성했다면 
#객체 생성 이후에 클래스 변수를 수정하고 싶을 때 위와 같이 클래스 이름.변수를 쓰면 됨 
#class 명을 쓰니 다시 값이 바뀌는 것을 확인할 수 있음 card9 = Card()
card9.charge(10000)

#클래스 변수를 수정했기 때문에 모든 객체(카드 발급자들)들이 다 적용됨

 

 

class PointCard:

    def __init__(self, name, phone_number):  # 클래스 객체를 만들면 반드시 실행
        self.name = name  # 인스턴스 변수    # 되는 함수
        self.phone_number = phone_number  # 인스턴스 변수
        self.points = 0  # 인스턴스 변수
        self.raise_amount = 0.01  
        print(f'{self.name}님, 르봉르쥬 빵집 포인트 적립회원으로 등록되었습니다. 핸드폰 번호: {self.phone_number}')
        print('현재 적립된 포인트는', int(self.points), '포인트입니다.')

    def charge(self, amount):
        points = amount * self.raise_amount  # 클래스 변수를 사용
        print( int(points), '포인트가 적립 되었습니다.')
        self.points += points
        print('현재 적립된 포인트는', int(self.points), '입니다.')

    def consume(self, amount):
        self.points -= amount
        if self.points >= 0:
            print(amount, '포인트가 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print(self.points, '포인트 남았습니다.')

 

import tkinter as tk
from tkinter import messagebox

class PointCard:
    raise_amount = 0.01  # 클래스 변수

    def __init__(self, phone_number):
        self.phone_number = phone_number  # 인스턴스 변수
        self.points = 0  # 인스턴스 변수
        print(f'{self.phone_number} 번호로 르봉르쥬 빵집 포인트 적립회원으로 등록되었습니다.')
        print('현재 적립된 포인트는', self.points, '포인트입니다.')

    def charge(self, amount):
        points = amount * PointCard.raise_amount  # 클래스 변수를 사용
        print(points, '포인트가 적립 되었습니다.')
        self.points += points
        print('현재 적립된 포인트는', self.points, '입니다.')

    def consume(self, amount):
        self.points -= amount
        if self.points >= 0:
            print(amount, '포인트가 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print(self.points, '포인트 남았습니다.')

# GUI 코드 시작
def register_customer():
    phone = phone_entry.get()
    if phone:
        customers[phone] = PointCard(phone)
        messagebox.showinfo("회원 등록", f"{phone} 번호로 등록되었습니다.")
    else:
        messagebox.showwarning("입력 오류", "핸드폰 번호를 입력해주세요.")

def charge_points():
    phone = phone_entry.get()
    amount = amount_entry.get()
    if phone in customers and amount.isdigit():
        amount = int(amount)
        customer = customers[phone]
        customer.charge(amount)
        points_label.config(text=f"현재 포인트: {customer.points:.1f}")
    else:
        messagebox.showwarning("입력 오류", "유효한 핸드폰 번호와 금액을 입력해주세요.")

root = tk.Tk()
root.title("르봉르쥬 빵집 포인트 적립 시스템")
root.geometry("400x300")  # 창 크기를 크게 설정

customers = {}  # 고객 정보를 저장하는 딕셔너리

# 고객 정보 입력 프레임
frame1 = tk.Frame(root)
frame1.pack(pady=20)

tk.Label(frame1, text="핸드폰 번호:").grid(row=0, column=0, padx=5)
phone_entry = tk.Entry(frame1)
phone_entry.grid(row=0, column=1, padx=5)

register_button = tk.Button(frame1, text="회원 등록", command=register_customer)
register_button.grid(row=1, columnspan=2, pady=10)

# 구매 금액 입력 프레임
frame2 = tk.Frame(root)
frame2.pack(pady=20)

tk.Label(frame2, text="구매 금액:").grid(row=0, column=0, padx=5)
amount_entry = tk.Entry(frame2)
amount_entry.grid(row=0, column=1, padx=5)

charge_button = tk.Button(frame2, text="포인트 적립", command=charge_points)
charge_button.grid(row=1, columnspan=2, pady=10)

# 포인트 출력 라벨
points_label = tk.Label(root, text="현재 포인트: 0")
points_label.pack(pady=20)

root.mainloop()

 

구독료를 받을수 있는 빵집 적립 포인트 화면을 여러분 자유롭게 개발하시오..

import tkinter as tk
from tkinter import messagebox

class PointCard:
    raise_amount = 0.01  # 클래스 변수

    def __init__(self, phone_number):
        self.phone_number = phone_number  # 인스턴스 변수
        self.points = 0  # 인스턴스 변수
        print(f'{self.phone_number} 번호로 르봉르쥬 빵집 포인트 적립회원으로 등록되었습니다.')
        print('현재 적립된 포인트는', self.points, '포인트입니다.')

    def charge(self, amount):
        points = amount * PointCard.raise_amount  # 클래스 변수를 사용
        print(points, '포인트가 적립 되었습니다.')
        self.points += points
        print('현재 적립된 포인트는', self.points, '입니다.')

    def consume(self, amount):
        self.points -= amount
        if self.points >= 0:
            print(amount, '포인트가 사용되었습니다.')
        else:
            print('잔액이 부족합니다.')
        print(self.points, '포인트 남았습니다.')

# GUI 코드 시작
# 회원 등록 함수
def register_customer(): 
    phone = phone_entry.get()  # 입력된 핸드폰 번호를 가져옵니다.
    if phone:                  # 만약 핸드폰 번호가 있다면 
        customers[phone] = PointCard(phone)  # 고객 딕셔너리에 새로운 고객을 등록합니다.
        messagebox.showinfo("회원 등록", f"{phone} 번호로 등록되었습니다.") #성공 메세지 출력
    else:
        messagebox.showwarning("입력 오류", "핸드폰 번호를 입력해주세요.") # 핸드폰 번호를
                                          # 입력하지 않으면 경고 메세지를 출력합니다.

# 포인트 적립함수
def charge_points():
    phone = phone_entry.get()     # 입력 핸드폰번호를 가져옵니다. 
    amount = amount_entry.get()   # 입력 구매 금액을 가져옵니다. 
    if phone in customers and amount.isdigit(): #핸드폰 번호가 등록되어있고 금액이 숫자인지 확인
        amount = int(amount)          # 금액을 정수고 변환합니다. 
        customer = customers[phone]   # 고객정보를 가져옵니다. 
        customer.charge(amount)       # 포인트를 적립합니다. 
        points_label.config(text=f"현재 포인트: {customer.points:.1f}") # 현재 포인트 업데이트
    else:
        messagebox.showwarning("입력 오류", "유효한 핸드폰 번호와 금액을 입력해주세요.")
        # 입력 오류시 경고 메세지를 출력합니다. 


root = tk.Tk()  # tk모둘의 Tk() 클래스를 가지고 root 객체를 만듭니다. 
root.title("르봉르쥬 빵집 포인트 적립 시스템")  # 창의 제목을 설정합니다. 
root.geometry("800x800")  # 창 크기를 크게 설정

customers = {}  # 고객 정보를 저장하는 딕셔너리

# 고객 정보 입력 프레임 - 핸드폰 번호를 입력받는 UI 를 구성합니다. 
frame1 = tk.Frame(root, width=400, height=100)  # 프레임의 크기 설정
frame1.pack(pady=20)   # 입력 프레임을 화면에 셋팅
#frame1.grid_propagate(False)   # 프레임 크기가 내부 위젯에 의해 변경되지 않도록 설

tk.Label(frame1, text="핸드폰 번호:").grid(row=0, column=0, padx=5)  # 라벨생성
phone_entry = tk.Entry(frame1)  # 핸드번호를 입력받을 entry 생성
phone_entry.grid(row=0, column=1, padx=5)  # entry 배치

#회원 등록 번호 버튼 생성
register_button = tk.Button(frame1, text="회원 등록", command=register_customer)
register_button.grid(row=1, columnspan=2, pady=10)  # 버튼 위치 지정해서 배치

# 구매 금액 입력 프레임 - 구매금액을 입력받아 포인트를 적립하는 UI 를 구성
frame2 = tk.Frame(root)  
frame2.pack(pady=20)

tk.Label(frame2, text="구매 금액:").grid(row=0, column=0, padx=5) # 라벨 생성
amount_entry = tk.Entry(frame2)  # 구매 금액을 입력받을 ENTRY 생성
amount_entry.grid(row=0, column=1, padx=5) # ENTRY 배치

# 포인트 적립 버튼 생성 
charge_button = tk.Button(frame2, text="포인트 적립", command=charge_points)
charge_button.grid(row=1, columnspan=2, pady=10) # 버튼 배치

# 포인트 출력 라벨 - 현재 적립된 포인트 출력합니다. 
points_label = tk.Label(root, text="현재 포인트: 0")
points_label.pack(pady=20)   # 출력 라벨 배치

# 사진을 입력하기 위한 코드
from  tkinter import  PhotoImage
try:
    bread_image = PhotoImage(file='c:\\data\\bread_image.png')
    bread_label = tk.Label(root, image=bread_image)
    bread_label.pack(pady=20)  
except tk.TclError:
    messagebox.showwarning("이미지 오류", "이미지를 열수 없습니다")

root.mainloop()  # tkinter 메인 루프를 시작합니다.