У вас правильная идея, но вы, кажется, немного новичок в ООП.Как на счет этого?
class Item:
def __init__(self, name, value, weight):
self.name = name
self.value = value
self.weight = weight
class Knapsack:
def __init__(self, max_weight):
self._items = []
self.max_weight = max_weight
@property
def total_weight(self):
return sum(i.weight for i in self._items)
@property
def total_value(self):
return sum(i.value for i in self._items)
def add(self, item):
if self.total_weight + item.weight > self.max_weight:
raise ValueError("that ain't gonna fit in there")
self._items.append(item)
sack = Knapsack(100)
sack.add(Item('a', 1, 10))
sack.add(Item('b', 1, 20))
sack.add(Item('c', 1, 30))
print('Total weight: ', sack.total_weight)
print('Total value: ', sack.total_value)
try:
sack.add(Item('too big', 1, 50))
except ValueError as e:
print(e)
Обновление:
Несколько заметок.Вы можете реализовать средство установки элементов так, как вы это делали, но конечное использование будет нелогичным, вам нужно будет сделать что-то вроде sack.items = item
, чтобы добавить элемент.Вы не хотите определять сеттеры ни для веса, ни для значения, поскольку они изменяются только при изменении элементов и не могут быть изменены независимо.Вы можете попытаться сделать Knapsack подклассом списка, но вам придется реализовать кучу «секретных» методов, чтобы заставить его работать, и я думаю, что для новичка это слишком сложно для небольшой выгоды.
Обновление при обновлении:
Имейте в виду, что вышеупомянутое не является высококачественной треской, она предназначена только для иллюстрации реализации.Например, я бы сделал sack.add(Item('x', 'x', 'x'))
и сломал бы все это.