对象集合的最佳设计模式

use*_*495 5 python design-patterns

我有以下架构:

\n\n
         +-----------------+\n         |   Collection    |\n         |                 |\n         |                 |\n         |                 |\n         |                 |\n         +-----------------+\n           |        ^\n           |        |\n  Create() |        |\n           |        |\n           v        | GetItem(B)\n+------------+      |\n|   Item A   |      |\n|            |      |\n|            +------+\n|            |\n+------------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

管理项目集合的类创建项目。这些物品可能需要收藏中的其他物品。

\n\n

实际代码位于 python 中,目前将Collection其自身作为参数传递给创建的Item. 在我看来,这是一种不好的做法。Collection我可以看到的唯一改进是传递所需的几个函数Item,而不是整个实例。

\n\n

例如:

\n\n
class Collection:\n    GetItem(self, id):\n        ...\n    CreateItem(self, id):\n        item = Item(id, self) # <-- pass self\n        ...\n\nclass Item:\n    __init__(self, id, col):\n        ...\n        col.GetItem(...)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何避免将 self 作为参数传递?或者说这是Python中的常见用法?

\n\n

更详细的例子

\n\n
 \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90            \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90           \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90                              \n \xe2\x94\x82Client\xe2\x94\x82            \xe2\x94\x82Collection\xe2\x94\x82           \xe2\x94\x82ItemA\xe2\x94\x82                              \n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98                              \n    \xe2\x94\x82 UpdateItem(A, param)\xe2\x94\x82                    \xe2\x94\x82                                 \n    \xe2\x94\x82 \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80>                    \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82 Update(param, self)\xe2\x94\x82  \xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n    \xe2\x94\x82                     \xe2\x94\x82 \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80>  \xe2\x95\x91Need to update linked ItemB \xe2\x96\x91\xe2\x95\x91\n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82  \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n    \xe2\x94\x82                     \xe2\x94\x82     GetItem(B)     \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82 <\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80                                 \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82        ItemB       \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82  \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 \xe2\x94\x80 >                                 \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82                                 \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90                            \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82    \xe2\x94\x82 UpdateItemB()              \n    \xe2\x94\x82                     \xe2\x94\x82                    \xe2\x94\x82<\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98                            \n \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90            \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90           \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90                              \n \xe2\x94\x82Client\xe2\x94\x82            \xe2\x94\x82Collection\xe2\x94\x82           \xe2\x94\x82ItemA\xe2\x94\x82                              \n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98                              \n
Run Code Online (Sandbox Code Playgroud)\n

小智 0

似乎是使用复合模式的经典场所: https ://sourcemaking.com/design_patterns/composite

每个实例都可以是一个集合或一个项目,您的客户可以互换使用它们。