我们假设我们有两个班级Basket
和Item
。每个篮子都包含一个项目列表。我可以在项目中存储id
个项目,或直接存储项目对象。哪个是最好的解决方案,以及为什么(在内存使用,方便性等方面......)?
案例A
class Basket(object):
def __init__(self, basket_name):
self._name = basket_name
self._items = []
def add_item(self, item_id)
self._items.append(item_id)
class Item(object):
def __init__(self, item_id):
self._id= item_id
>>> b = Basket('My_Basket')
>>> i1 = Item(1)
>>> i2 = Item(2)
>>> b.add_item(1)
>>> b.add_item(2)
案例B
class Basket(object):
def __init__(self, basket_name):
self._name = basket_name
self._items = []
def add_item(self, item)
self._items.append(item)
class Item(object):
def __init__(self, item_id):
self._id= item_id
>>> b = Basket('My_Basket')
>>> i1 = Item(1)
>>> i2 = Item(2)
>>> b.add_item(i1)
>>> b.add_item(i2)
答案 0 :(得分:3)
您应该直接存储这些项目。如前所述,这样做没有资源问题,然后它为篮子提供了对项目的直接访问。说你想知道篮子的重量是多少?好吧,如果你在你的商品类中添加.weight方法,那么你可以让你的购物篮迭代它所包含的所有商品并返回它们的重量。
答案 1 :(得分:1)
我更喜欢存储对象,而不是ID。因为每次你必须对你的物品做一些事情,你必须先以某种方式通过ID获取/加载这个对象。但这是一般情况。
如果您将拥有大量商品且没有完整列表的操作(例如,购物篮只会对单个对象执行操作,而不是完整收集),您可能只想存储ID。
答案 2 :(得分:1)
选项B通常是最佳选择,因为这是面向对象编程的工作原理。因为您直接使用对象,所以您也可以直接在代码中访问它们。如果您使用链接选项然后为了访问给定的Item
,您将不得不进行某种查询来查找该对象。当您直接使用该对象时,python基本上就是为您创建该链接。该对象不会被复制两次,而是在_items
对象内的Basket
列表中引用。
此外,
中的self._id= item_id
def __init__(self, item_id):
self._id= item_id
不需要,因为您不需要找到该ID,因此:
>>>i1 = Item(1)
>>>i2 = Item(2)
只会变成:
>>> i1 = Item()
>>> i2 = Item()
答案 3 :(得分:1)
一切是一个对象,包括用作其他对象ID的整数。因此,在案例A和案例B中,您都将对象的引用附加到Basket._items
列表。
那么A和B有什么区别?如果您只存储ID,那么您将如何引用原始对象?很难保证它们将存在于命名空间中。从item
实例中查找属性的任何代码都可能属于该陷阱。