如何在python中调用同一个类的不同实例?

时间:2012-07-10 19:22:29

标签: python instances

我是Python新手。我正在SimPy中编写一个模拟生产线的模型,看起来像:机器1 - >缓冲液1 - >机器2 - >缓冲液2 - >等等..

我的问题: 我有一个类,机器,其中有几个实例。假设当前实例是机器2.此实例的方法影响机器1和3的状态。例如:如果缓冲区2为空,则机器3空闲。但是当机器2将部件放入缓冲器2时,机器3应该被激活。

那么,从该类的任何给定实例引用同一类的不同实例的方法是什么? 另外,问题略有不同:从另一个类的当前实例调用对象(在本例中为缓冲区1和2)的方法是什么?

编辑:编辑以增加关于系统的更多清晰度。

3 个答案:

答案 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()方法将项​​目放在队列中进行处理,然后立即返回;通过这种方式,您可以使机器并行处理。

使用这个系统,机器之间的连接是明确的,每台机器只知道它后面的那个(需要知道的那个)。

我使用“线程”这个词来描述将这样的对象链接在一起的过程。正在处理的项目在到达输出之前在机器之间跟随线程。它有点含糊不清,因为它与执行线程无关,所以这个术语并不完美。