我已经查看了Creating instances in a loop之类的问题,但我需要每次创建具有不同值的新实例,而不是实例的一堆克隆。
下面,我为Bill类的实例编写了一个餐馆小费计算器(含税)。我写了一个类方法,在第一个实例的计算完成时创建一个新实例。
虽然这有效但如果我打开.py文件继续添加新实例并调用所需的所有类方法,如果我以某种方式创建了一个循环,当我输入&#时会创建一个新实例,这将更有用34;是"在第二类方法的自我选择中。
我之前尝试创建循环导致创建未命名的实例。 "退货单(示例,示例)"并不是为我做的,因为我无法调用方法(我可能会,但它会让人头疼,不会是pythonic。)我也不能将它附加到列表中。
persons = []
class Bill:
def __init__(self, check, tax, tip):
self.check = check
self.tax = tax
self.tip = tip
def addPersons(self):
self.choice = input("Do you want to calculate for another person?")
if self.choice == "Yes" or self.choice == "yes":
person2 = Bill(float(input("Check: ")), float(input("Tax: ")), float(input("Tip: ")))
return person2
else:
pass
def percent(self):
self.tax = self.tax/100
self.tip = self.tip/100
def calculate(self):
self.result_1 = self.check + (self.check * self.tax)
self.result_final = self.result_1 + (self.result_1 * self.tip)
self.difference = self.result_final - self.result_1
self.advice = self.result_1, "is your check with tax added.", self.difference, "is how much tip you need to pay.", self.result_final, "is your total."
return self.advice
a = Bill(float(input("Check: ")), float(input("Tax: ")), float(input("Tip: ")))
a.percent()
a.calculate()
print(a.advice)
persons.append(a)
b = a.addPersons()
b.percent()
b.calculate()
print(b.advice)
persons.append(b)
c = b.addPersons()
c.percent()
c.calculate()
print(c.advice)
persons.append(c)
感谢您的时间和帮助。 :)
答案 0 :(得分:3)
我会在课堂上重构addPersons()
方法,并执行如下所示的操作。请注意,我还calculate()
自动拨打percent()
,因此无需在外部完成。
这是一个更好的设计,因为它移动了与用户交互的责任,并在类本身之外获得输入(这并不是它真正关心的)。它还允许它与不同的用户界面一起使用或以编程方式使用,例如从数据库或其他容器中的数据中使用。
class Bill:
def __init__(self, check, tax, tip):
self.check = check
self.tax = tax
self.tip = tip
def percent(self):
self.tax = self.tax/100
self.tip = self.tip/100
def calculate(self):
self.percent()
self.result_1 = self.check + (self.check * self.tax)
self.result_final = self.result_1 + (self.result_1 * self.tip)
self.difference = self.result_final - self.result_1
self.advice = (self.result_1, "is your check with tax added.",
self.difference, "is how much tip you need to pay.",
self.result_final, "is your total.")
return self.advice
bills = []
while True:
choice = input("Do you want to calculate for another person?")
if choice.lower().startswith("y"):
break
bill = Bill(float(input("Check: ")), float(input("Tax: ")),
float(input("Tip: ")))
bill.calculate()
print(*bill.advice)
bills.append(bill)
循环不会创建Bill
类的命名实例。相反,它将它们全部存储在名为bills
的列表中。如果你想将一个人的名字与每个人的名字联系起来,你可以把它们放在一个按姓名键入的字典中。
bills = {}
while True:
choice = input("Do you want to calculate for another person?")
if choice.lower().startswith("y"):
break
person_name = input("Enter the name of the person: ")
if not person_name:
continue # ask about continuing again
bill = Bill(float(input("Check: ")), float(input("Tax: ")),
float(input("Tip: ")))
bill.calculate()
print("{}'s bill:".format(person_name))
print(*bill.advice)
bills[person_name] = bill