将列表传递给__init__类

时间:2018-10-19 12:21:04

标签: python string class private init

我正试图了解类的结构。

该示例是带有__size__toppings_list的比萨饼订单。 我可以很容易地通过尺寸,但不会让我将浇头作为清单传递 我不断得到

size = small
toppings = small

无论我如何尝试调用__string__打印功能,它都不能很好地发挥作用。

class Pizza:

    def __init__(self, size = "small", topping_list = []):
        self.__size = size
        self.__topping_list = topping_list

    def __string__(self):
        string = "Size is" + self.__size + ' and Topping is ' + self.__topping_list
        return string

    def set_size(self, size):
        self.__size = size

    def get_size(self):
        return self.__size

    def set_topping(self, topping):
        self.__topping_list

    def get_topping(self):
        return self.__size

    def add_topping(self, topping):
        self.__topping_list

    def get_cost(self):
        cost = 0
        size = pizza.get_size()
        toppings = pizza.get_topping()
        totalToppings = len(toppings)

        if size == "small":
            cost += 10
        elif size == "medium":
            cost += 12
        elif size == "large":
            cost +=14        
        cost += totalToppings * 2

        return cost


pizza = Pizza("small",["meat"])
size = pizza.get_size()
toppings = pizza.get_topping()
print(size)
print(toppings)
pizza_string = str(pizza)
print(pizza_string)

1 个答案:

答案 0 :(得分:3)

您的代码中发生了很多小怪异的事情。

首先,修复get_topping方法(如注释中所述),重新创建您的实例,该实例将起作用—这是用于解决主要问题。

小事,但强烈建议:

  • 使用[空]列表作为默认参数不是一个好主意,除非您知道自己在做什么。列表是可变的,参数是“绑定”到函数对象的。因此,一次更改该默认值将影响所有后续调用。

  • 您尝试使用__string__实现的事情似乎在实现__str__

  • 时出错
  • 在使用__attr时,请三思而后行。如果您有Java之类的语言的经验,那么这似乎是个好主意,但是在python中,以这种方式“隐藏”属性通常是个坏主意。用户仍然可以使用此方法,同时使您的类难以继承-使用非协作类并不是一件很有趣的事情。如果要标识非公共接口,请考虑使用单个下划线(_size)。如果您不确定是否应该公开-将其公开。您可以随时将其设置为@property而不会破坏界面。 get_...方法同样适用-如果您在没有属性的情况下检索属性,则没有必要像这样的代码。仅具有self.size属性并使用它就可以了。如果您百分百确定要在实例化后不希望对此内容进行编辑,请使其

    def __init__(...):
        self._size = ...
    @property
    def size(self):
        return self._size