#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))
, потому что Pythonset
может содержать только уникальные элементы.
Ответ №2:
Я думаю, вы имели в виду self.category = cat
в своем конструкторе.