Передача списка в класс __init__ - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь понять структуру класса.

Пример - заказ пиццы с __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 голосов
/ 19 октября 2018

В вашем коде происходит много странных вещей.

Прежде всего, исправьте метод get_topping (как указано в комментариях), заново создайте свой экземпляр, и он будет работать - этодля исправления вашей основной проблемы.

Незначительные вещи, но настоятельно рекомендуется:

  • использование [пустого] списка в качестве аргумента по умолчанию не является хорошей идеей, пока вы не знаете, что выделаешь.Список является изменяемым, а аргументы «привязаны» к объекту функции.Поэтому изменение значения по умолчанию один раз повлияет на все последующие вызовы.

  • то, чего вы пытаетесь достичь с помощью __string__, выглядит как ошибка при реализации __str__

  • Пожалуйста, подумайте дважды (или больше), когда вы используете __attr.Вероятно, это выглядит хорошей идеей, если у вас есть опыт работы с такими языками, как Java, но в python вообще плохая идея «скрывать» атрибуты таким образом.Это по-прежнему будет доступно для пользователей, в то время как ваш класс будет трудно унаследовать, а с классами, не относящимися к совместной работе, работать не весело.Если вы хотите определить непубличный интерфейс - попробуйте использовать одно подчеркивание (_size).Если вы не уверены, что это должно быть публично - сделайте это публичным.Вы всегда можете сделать это @property, не нарушая интерфейс.То же самое относится и к get_... методам - ​​нет смысла иметь подобный код, если вы извлекаете атрибут без атрибутов.Просто иметь атрибут self.size и использовать его нормально.Если вы на 100% уверены, что не хотите делать это редактируемым после создания экземпляра, сделайте его

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