我如何创建一个在python 3中创建实例的循环?

时间:2015-07-14 03:35:28

标签: python oop loops python-3.x

我已经查看了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)

感谢您的时间和帮助。 :)

1 个答案:

答案 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