代码之家  ›  专栏  ›  技术社区  ›  floatingpurr

OOP:编码不同类对象之间关系的最佳方法

  •  1
  • floatingpurr  · 技术社区  · 10 年前

    假设我们有两个班 Basket 和 Item 每个篮子包含一个项目列表。我可以在篮子里储存 id 或者直接是项目对象。哪一个是最好的解决方案,为什么(在内存使用、covenience等方面)?

    案例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)
    
    4 回复  |  直到 10 年前
        1
  •  3
  •   bravosierra99    10 年前

    您应该直接存储这些项目。如前所述,这样做没有资源问题,然后它为购物篮提供了对物品的直接访问。说你想知道篮子有多重?如果您向items类添加了一个.weight方法,那么您可以让您的篮子遍历它包含的所有项目,并返回它们的权重。

        2
  •  1
  •   Alex    10 年前

    我更喜欢存储对象,而不是ID。因为每次你必须对你的物品做一些事情时,你必须首先以某种方式通过ID获取/加载这个对象。但这是一般情况。

    如果您将有大量的项目,并且没有完整列表的操作(例如,篮子将只对单个对象执行操作,而不是对完整集合),您可能只需要存储ID。

        3
  •  1
  •   RFV    10 年前

    选项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()
    
        4
  •  1
  •   dodell    10 年前

    每件事 在python中,是一个对象,包括用作其他对象ID的整数。因此,在情况A和情况B中,都将对象的引用附加到 Basket._items 列表

    那么A和B的区别是什么呢?如果只存储ID,那么如何引用原始对象?更难保证它们将存在于名称空间中。从中查找属性的任何代码 item