多对一关系的

时间:2018-06-01 12:21:49

标签: python

我正在处理一个项目,并且我遇到了一个问题,即一个类的实例被传递给许多工作对象。

broker = Broker(...)

worker1 = Worker(broker, "001")
worker2 = Worker(broker, "002")
worker3 = Worker(broker, "003")

所有这些工作者现在都在调用它们作为参数传递的Broker对象中的函数。由于工人都在管理由ID标识的不同经纪人账户,id参数(" 001"," 002"," 003&#34 ;)需要在每次函数调用时从工作者传递给代理,以便他们可以识别自己,并且经纪人知道他必须向哪个帐户发送指令。

从内部算法逻辑中解析出来的一个操作可能是关闭worker1的所有位置:

worker1.closeAllPositions()

Worker-Class的功能实现是以将指令传递给Broker-Class的方式完成的。但是由于Broker确实需要知道当前调用它的worker的ID,所以它的id作为参数传递:

class Worker:

    def __init__(self, broker, id):
         self.id = id
         self.broker = broker

    def closeAllPositions(self):
        self.broker.closeAllPositions(self.id)

    def getSummary(self):
        self.broker.getSummary(self.id)

    def getBalance(self):
        self.broker.getBalance(self.id)

所有Broker接口现在都配备了id参数,因此从工作者到Broker的任何函数调用都使用帐户进行标识。但是由于Broker函数具有子依赖关系(id传递给第一个没有必要将id传递给链中任何其他代理函数的人)id - 问题失控并且ID被传递到处都很快,看​​起来非常不洁净。

class Broker:

   def __init__(self, ...):
        ...

    def getSummary(self, id):
        self.setCallerID(id)                    <-!!! Ugly
        ....

    def getBalance(self, id, returnType):
        self.setCallerID(id)                    <-!!! Ugly
        ....

我没有在任何函数调用上传递此信息,而是在寻找引擎方法来解析调用者ID。类似于调用钩子来设置调用者ID的东西,只要调用Broker方法就会运行。

Workers调用Broker函数的顺序以及Worker函数不可确定的顺序以及Workers想要与单个代理交互的顺序是完全随机的。

- &GT;因此,对Worker-Broker接口的任何调用都需要某种标识符。

在Python中是否有一种优雅的方式如何在没有通过任何函数调用传递ID参数的情况下,对象如何向另一个对象标识自己?

1 个答案:

答案 0 :(得分:0)

您可以为Worker个对象提供使用Broker s调用相应id方法的方法

class Worker
    def __init__(self, broker, id):
        self.broker = broker
        self.id = id

    def closeAllPositions(self):
        return self.broker.closeAllPositions(self.id)

然后,您只需调用self.broker.closeAllPositions("id")

,而不是self.closeAllPositions()