我是python的新手,更不用说Tkinter,我正在创建一个面向对象的银行帐户,我有一个工作程序,但是在设计应用程序时,我计划将OOP的所有功能添加到代码中,我将如何添加方法覆盖和重载到此程序,同时保持其完整功能?提供你的见解。
from tkinter import *
from random import randint
import time
class Account:
def __init__(self, init_balance=0):
self.balance = init_balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
def get_balance(self, init_balance, rate):
return self.get_balance() * self._rate
class InterestAccount(Account):
def __init__(self, init_balance=0, rate=0.1):
super().__init__(init_balance)
self._rate = rate
def interest(self):
return self.balance * self._rate
class GUI(Tk):
def __init__(self):
Tk.__init__(self)
self.title('Bank Account')
#Menu#
menu = Menu(self)
acct_type_menu = Menu(menu)
menu.add_cascade(label='Account Type', menu=acct_type_menu)
acct_type_menu.add_command(label='Standard', command=self.set_type_standard)
acct_type_menu.add_command(label='Interest', command=self.set_type_interest)
self.config(menu=menu)
#Account#
start_balance = randint(100, 500)
self.acct = Account(start_balance)
self.my_interest = InterestAccount(start_balance)
self.interest = self.my_interest.balance + self.my_interest.interest()
#Labels#
Label(self, text='Current Balance:').pack()
self.balance_label = Label(self, text='Error: Select account type')
self.balance_label.pack()
#Button#
btns_frame = Frame(self)
btns_frame.pack(side=TOP, fill=X)
Button(btns_frame, text='Deposit', width=13, command=self.deposit).pack(side=LEFT)
Button(btns_frame, text='Withdraw', width=13, command=self.withdraw).pack(side=RIGHT)
#Textbox#
vcmd = (self.register(self.onValidate), '%S')
self.text = Entry(self, validate='key', vcmd=vcmd)
self.text.pack()
def onValidate(self, S):
if S in '0123456789.':
return True
return False
def set_type_standard(self):
self.acct_type = 'standard'
self.balance_label.config(text=round(self.acct.balance, 2))
def set_type_interest(self):
self.acct_type = 'interest'
self.balance_label.config(text=round(self.interest, 2))
def clear_entry(self):
self.text.delete(0, END)
def deposit(self):
if self.acct_type == 'interest':
a = int(self.text.get())
self.interest += a
self.balance_label.config(text=round(self.interest, 2))
elif self.acct_type == 'standard':
a = int(self.text.get())
self.acct.balance += a
self.balance_label.config(text=round(self.acct.balance, 2))
else:
self.balance_label.config(text='Error: Select account type')
self.clear_entry()
def withdraw(self):
if self.acct_type == 'interest':
a = int(self.text.get())
self.interest -= a
self.balance_label.config(text=round(self.interest, 2))
elif self.acct_type == 'standard':
a = int(self.text.get())
self.acct.balance -= a
self.balance_label.config(text=round(self.acct.balance, 2))
else:
self.balance_label.config(text='Error: Select account type')
self.clear_entry()
if __name__ == '__main__':
GUI().mainloop()
答案 0 :(得分:1)
函数重载(也称为方法重载)是一种编程概念,它允许程序员定义两个或多个具有相同名称和相同范围的函数。
你已经有一些"重载"在你的代码中:
class InterestAccount(Account):
def __init__(self, init_balance=0, rate=0.1):
创建新的InterestAccount
对象时,可以使用0,1或2参数调用它,因为指定了这些默认值。正如this SO answer中提到的,Python是动态类型的,因此您不需要像使用Java那样使用不同的参数创建多个相同的方法。
Overriding是一种面向对象的编程功能,它使子类能够为已经在其父类中定义和/或实现的方法提供不同的实现...
您很有可能覆盖deposit
类中的withdraw
和InterestAccount
方法,因为它继承自Account
并且目前使用其父级的实现这些方法。只需在deposit
类中定义withdraw
和InterestAccount
方法,但要做的不同于父类中的操作。