如何摆脱附加到超类实例列表的子类中的eval?

时间:2019-02-14 08:43:46

标签: python python-3.x list class

我正在使用eval运行生成的字符串,以将新创建​​的EggOrder实例附加到DailyOrders类的正确实例的列表中。 EggOrder提供的日期用于附加到正确的实例。这依赖于eval和DailyOrders实例的变量名称,因此删除它会很棒。我知道一定有更好的方法。

class DailyOrders:

    PRICE_PER_DOZEN = 6.5

    def __init__(self, day):
        self.orders = []
        self.day = day

    def total_eggs(self):
        total_eggs = 0
        for order in self.orders:
            total_eggs += order.eggs
        return total_eggs

    def show_report(self):
        if self.total_eggs() < 0:
            print("No Orders")
        else:
            print(f"Summary:\nTotal Eggs Ordered: {self.total_eggs()}")
            print(f"Average Eggs Per Customer: {self.total_eggs() / len(self.orders):.0f}\n*********")


class EggOrder():

    def __init__(self, eggs=0, name="", day=""):
        if not name:
            self.new_order()
        else:
            self.name = name
            self.eggs = eggs
            self.day = day

        eval(f"{self.day.lower()}.orders.append(self)")

    def new_order(self):
        self.name = string_checker("Name: ")
        self.eggs = num_checker("Number of Eggs: ")
        self.day = string_checker("Date: ")

    def get_dozens(self):
        if self.eggs % 12 != 0:
            dozens = int(math.ceil(self.eggs / 12))
        else:
            dozens = self.eggs / 12
        return dozens

    def show_order(self):

        print(f"{self.name} ordered {self.eggs} eggs. The price is ${self.get_dozens() * DailyOrders.PRICE_PER_DOZEN}.")


if __name__ == "__main__":

    friday = DailyOrders("Friday")
    friday_order = EggOrder(12, "Someone", "Friday")
    friday_order.show_order()
    friday.show_report()

    saturday = DailyOrders("Saturday")
    saturday_order = EggOrder(19, "Something", "Saturday")
    saturday_order = EggOrder(27, "Alex Stiles", "Saturday")
    saturday.show_report()
  • DailyOrders实际上不是超类(它是在较早的版本中),它的行为类似于一个超类,我怀疑答案可能具有某些继承性。

0 个答案:

没有答案