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+------------+\nRun Code Online (Sandbox Code Playgroud)\n\n管理项目集合的类创建项目。这些物品可能需要收藏中的其他物品。
\n\n实际代码位于 python 中,目前将Collection其自身作为参数传递给创建的Item. 在我看来,这是一种不好的做法。Collection我可以看到的唯一改进是传递所需的几个函数Item,而不是整个实例。
例如:
\n\nclass 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(...)\nRun Code Online (Sandbox Code Playgroud)\n\n如何避免将 self 作为参数传递?或者说这是Python中的常见用法?
\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 \nRun Code Online (Sandbox Code Playgroud)\n
小智 0
似乎是使用复合模式的经典场所: https ://sourcemaking.com/design_patterns/composite
每个实例都可以是一个集合或一个项目,您的客户可以互换使用它们。
| 归档时间: |
|
| 查看次数: |
3093 次 |
| 最近记录: |