情况是这样的。我有以下伪类:
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
现在,我的问题是 - 我应该将传输对象传递到需要它的方法的代理方法中,还是应该将传输对象简单地传递到代理构造函数中并从方法中调用它?即
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 个传输对象。我可以有多种传输(一种用于agentsA..N,另一种用于agentsO..Z)。
2) Transport 包含将代理列表作为参数的方法。例如,它可以在给定代理对象列表的情况下对代理运行并发通信测试。
但是,代理本身有时需要在传输中设置的属性(SSL 证书的位置等),以便某些在代理类中有意义的方法(远程重新启动代理等)。
我是否应该采用需要代理列表的方法并将它们移至 Transport 的类方法,然后在包含 Transport 实例的 Agent 对象中创建一个属性?我是否应该继续我正在做的事情并只要求将 Transport 对象传递给某些 Agent 对象方法?我应该以某种我没有看到的方式重构这一切吗?
任何有用的意见将不胜感激。
最佳答案
由于您甚至考虑将传输作为参数添加到代理的构造函数中,因此我假设一个代理永远不会使用多个传输。
我假设传输实例可以在没有任何代理连接到它的情况下执行一些有用的操作,反之亦然。
如果我的假设是正确的,我会提出这样的建议:
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)
如果您打算删除对象,您可能需要通过使用从代理到传输或另一个方向的弱引用来帮助垃圾收集器(或者实际上,在您的情况下,在两个方向上,因为您可能包含强引用到其他地方)。
编辑:
更新以反射(reflect)代理商可能会更改其运输:
- 将代理列表更改为代理集
- 添加了 Transport.remove_agent
- 修改了 Agent.set_transport 以检查之前是否已设置
关于python - 将对象传递给其他对象 - 通过方法或构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037790/