我是Python新手。我正在SimPy中编写一个模拟生产线的模型,看起来像:机器1 - >缓冲液1 - >机器2 - >缓冲液2 - >等等..
我的问题: 我有一个类,机器,其中有几个实例。假设当前实例是机器2.此实例的方法影响机器1和3的状态。例如:如果缓冲区2为空,则机器3空闲。但是当机器2将部件放入缓冲器2时,机器3应该被激活。
那么,从该类的任何给定实例引用同一类的不同实例的方法是什么? 另外,问题略有不同:从另一个类的当前实例调用对象(在本例中为缓冲区1和2)的方法是什么?
编辑:编辑以增加关于系统的更多清晰度。
答案 0 :(得分:4)
类的实例通常不了解该类的其他实例。
我建议您在类中保留一些实例集合,并使用该类查找实例:
class Machine(object):
lst = []
def __init__(self, name):
self.name = name
self.id = len(Machine.lst)
Machine.lst.append(self)
m0 = Machine("zero")
m1 = Machine("one")
print(Machine.lst[1].name) # prints "one"
答案 1 :(得分:3)
这是一个愚蠢的例子,我把你把一些数据放到第一台机器上,然后把它移到第一台缓冲区,然后把它移到第二台机器......
每台机器只是用它的ID号标记数据并传递它,但你可以让机器做任何事情。您甚至可以在每台机器获取数据时注册要调用的函数。
class Machine(object):
def __init__(self,number,next=None):
self.number=number
self.register_next(next)
def register_next(self,next):
self.next=next
def do_work(self,data):
#do some work here
newdata='%s %d'%(str(data),self.number)
if(self.next is not None):
self.next.do_work(newdata)
class Buffer(Machine):
def __init__(self,number,next=None):
Machine.__init__(self,number,next=next)
data=None
def do_work(self,data):
if(self.next is not None):
self.next.do_work(data)
else:
self.data=data
#Now, create an assembly line
assembly=[Machine(0)]
for i in xrange(1,20):
machine=not i%2
assembly.append(Machine(i) if machine else Buffer(i))
assembly[-2].register_next(assembly[-1])
assembly[0].do_work('foo')
print (assembly[-1].data)
修改强>
缓冲区现在也是机器。
答案 2 :(得分:1)
现在您添加了有关该问题的更多信息,我建议使用其他解决方案。
创建机器后,您可能希望将它们链接在一起。
class Machine(object):
def __init__(self):
self.handoff = None
def input(self, item):
item = do_something(item) # machine processes item
self.handoff(item) # machine hands off item to next machine
m0 = Machine()
m1 = Machine()
m0.handoff = m1.input
m2 = Machine()
m1.handoff = m2.input
def output(item):
print(item)
m2.handoff = output
现在,当您致电m0.input(item)
时,它会进行处理,然后将项目移交给m1
,这将执行相同的操作并交给m2
,这将进行处理并致电output()
。此示例显示了同步处理(在函数调用返回之前,项目将一直通过链)但您也可以使用.input()
方法将项目放在队列中进行处理,然后立即返回;通过这种方式,您可以使机器并行处理。
使用这个系统,机器之间的连接是明确的,每台机器只知道它后面的那个(需要知道的那个)。
我使用“线程”这个词来描述将这样的对象链接在一起的过程。正在处理的项目在到达输出之前在机器之间跟随线程。它有点含糊不清,因为它与执行线程无关,所以这个术语并不完美。