Объектно-ориентированное программирование — перебор аргументов

#python

#python

Вопрос:

У меня возникают проблемы с перебором аргумента и просто отображением аргумента «cat». Имейте в виду, что я добавляю элементы в пустой список self.item. Я также использую функцию showAllFormatted для форматирования данных.

Я попытался выполнить цикл, а затем использовать «return AllItems.ShowAllFormatted(i.cat )» но никаких результатов не было показано после добавления элементов в мой пустой список.

 class AllItems:

    def __init__(self, cat,comment, worth, amount):
        self.cat = cat
        self.comment= comment
        self.worth = worth
        self.amount = amount

    def ShowAllFormatted(self):
        print('{:>10}:>10}{:>10}{:>10}'.format(self.cat, 
        self.comment,self.worth,self.amount))

class Collection:

    def __init__(self):
        self.an_item = []

    def add_item(self):
        item = AllItems(cat, comment, worth,amount)
        self.item.append(item)

    def ShowAllItems(self):
        for i in self.an_item:
             AllItems.ShowAllFormatted(i)
        return i

    def showAllCat(self):
        for item in self.an_item:
             return item.cat
  

Комментарии:

1. У вас есть self.cat , затем попросите self.category .

2. @kwinkunks Я исправил это и изменил на self.cat .

3. @ajburnett344 Я замечаю несколько других проблем в вашем коде. Я дам ответ.

Ответ №1:

Вот версия вашего кода, которая работает… он может даже делать то, что вы хотите:

 class Item:

    def __init__(self, cat, comment, worth, amount):
        self.cat = cat
        self.comment= comment
        self.worth = worth
        self.amount = amount

    def show_formatted(self):
        print('{:>10}{:>10}{:>10}{:>10}'.format(self.cat, 
                                                self.comment,
                                                self.worth,
                                                self.amount,
                                                )
             )
        return None


class Collection:

    def __init__(self):
        self.items = []

    def add_item(self, cat, comment, worth, amount):
        item = Item(cat, comment, worth, amount)
        self.items.append(item)
        return None

    def show_all_items(self):
        for item in self.items:
            item.show_formatted()
        return None

    def get_all_cats(self):
        return [item.cat for item in self.items]
  

Вы можете протестировать его с:

 >>> c = Collection()  # Instantiate a Collection object.
>>> c.add_item('C', 'comment', 10, 1000)  # Add an item to it.
>>> c.add_item('C', 'words', 9, 999)  # Add another.
>>> c.show_all_items()
         C   comment        10      1000
         C     words         9       999
  

Здесь происходит довольно много вещей:

  • Я изменил название AllItems класса на Item , потому что казалось, что он хочет представлять одну вещь (из __ini__() того, что вы написали).
  • Я изменил название ShowAllFormatted метода, потому что каждый экземпляр класса ( self в основном) должен беспокоиться только об одном: о себе. ОН не знает / не заботится о том, чтобы быть частью коллекции.
  • add_item Метод в Collection классе не принял никаких аргументов, поэтому я добавил их. Теперь он может создавать экземпляры Item класса с некоторыми данными.
  • Я избавился от ShowAllCat , потому что я не был уверен, что он должен делать. Может быть, принять имя cat в качестве аргумента, затем перебирать элементы с этим cat и вызывать их show_formatted метод? Что-то вроде этого. Но вам не нужно будет ничего передавать show_formatted , сейчас он не принимает никаких других аргументов (но он мог бы, скажем, контролировать, как все печатается).

Я исправил пару других вещей и использовал больше имен Pythonic (начальные буквы в верхнем регистре для классов, строчные для всего остального). Но большая часть остального остается неизменной.

Не забудьте добавить строки документации ко всем вашим классам и методам!

Комментарии:

1. Спасибо! Сейчас я протестирую код. Мне действительно нужен был showallcat, потому что я хотел показать все категории из добавленного элемента.

2. Я попытался зациклить cat, используя return item.cat но вместо всех них появляется только один cat.

3. Вы можете вернуть только один раз из любой функции или метода. Итак, вам нужно будет собрать cats в какую-то коллекцию и вернуть ее, или распечатать их в цикле, или что-то в этом роде. Я добавил пример первого подхода к своему ответу. Я назвал это get_all_cats потому что ‘show’ каким-то образом подразумевает печать.

4. вау, как здорово это работает! последний вопрос, есть ли какой-либо способ получить уникальные значения при циклическом просмотре cats?

5. @ajburnett344 Определенно! Вы можете делать что угодно с помощью Python 🙂 Вот 2 способа: создать пустой список, перебирать элементы, но добавлять в список только в том случае, если их еще нет в списке ( if item not in unique_items: unique_items.append(item) что-то вроде этого), или делать list(set(list_of_cats)) , потому что Python set может содержать только уникальные элементы.

Ответ №2:

Я думаю, вы имели в виду self.category = cat в своем конструкторе.