这是情况。我有以下伪类:
class Agent:
def __init__(self):
self.blah = whatever
self.boo = thingy
def doA(self, transport):
res = transport.doX(self.blah)
def doB(self, transport):
res = transport.doY(self.boo)
class Transport:
def __init__(self):
self.bah = weee
def doX(self, item):
#.. do some other stuff here
def doY(self, item):
#.. do some more stuff here
现在,我的问题是 - 我应该将传输对象传递给需要它的方法的Agent方法,还是应该简单地将Transport对象传递给Agent构造函数并从方法中调用它?即
transport = Transport()
agent = Agent(transport)
class Agent:
def __init__(self, transport):
self.blah = whatever
self.transport = transport
def doA(self):
res = self.transport.doX(self.blah)
我将Transport转移到它自己的班级的原因是:
1)代理实例可以共享相同的传输对象 - 即:我只需要1个传输对象用于一组代理。我可以有多个传输(一个用于agentA..N,另一个用于agentsO..Z)。
2)Transport包含将代理列表作为参数的方法。例如,在给定代理对象列表的情况下,它可以对代理运行并发通信测试。
但是,代理本身有时需要在传输(SSL证书的位置等)中设置的属性,这些属性在Agent类中有意义(远程重新启动代理等)。
我是否应该使用需要代理列表的方法并将它们移动为Transport的类方法,然后在包含Transport实例的Agent对象中创建属性?我应该继续我正在做的事情,只需要将Transport对象传递给某些Agent对象方法吗?我应该以某种我没有看到的方式重构这一切吗?
非常感谢任何有用的意见。
答案 0 :(得分:3)
由于您甚至考虑将传输作为参数添加到代理的构造函数中,因此我假设一个代理永远不会使用多个传输。
我假设一个传输实例可以在没有连接任何代理的情况下做一些有用的事情,反之亦然。
如果我的假设是正确的,我会建议:
class System:
def associate_transport_and_agent(transport, *agents):
for agent in agents:
transport.add_agents(*agents)
agent.set_transport(transport)
class Transport:
def __init__(self):
self.bah = weee
self.agents = set()
def add_agents(self, *agents):
self.agents.update(agents)
def remove_agent(self, agent):
self.agents.remove(agent)
def doX(self, item):
# ...
class Agent:
def __init__(self):
self.blah = whatever
self.transport = None
def set_transport(self, transport):
if self.transport == transport:
return
if self.transport is not None:
self.transport.remove_agent(self)
self.transport = transport
def doA(self):
res = self.transport.doX(self.blah)
如果您打算删除对象,您可能需要通过使用代理到传输的弱引用或在其他方向(或实际上,在您的情况下,在两个方向上,因为您可能包含强引用)来帮助垃圾收集器他们在其他地方。)
编辑:
更新以反映代理可能会更改其传输:
答案 1 :(得分:0)
鉴于“代理只能使用1个传输,虽然可以切换传输”,但我建议您为__init__
设置一个(可选)参数来设置传输,并拥有代理商的运输属性是公开的。如果您需要在分配时运行代码,请创建一个属性。