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

2024-09-29 00:16:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手。我用SimPy编写了一个模拟程序来模拟生产线,它看起来像:machine1->;Buffer 1->;Machine 2->;Buffer 2->;依此类推。。在

我的问题: 我有一个类,Machine,其中有几个实例。假设当前实例是machine2。此实例的方法影响计算机1和3的状态。例如:如果缓冲器2是空的,那么机器3是空闲的。但当机器2将零件放入缓冲器2中时,机器3应被激活。在

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

编辑:编辑以增加系统的清晰度。在


Tags: 实例方法gt机器编辑buffer计算机machine
3条回答

类的实例知道类的其他实例是不常见的。在

我建议您在类本身中保留一些实例集合,并使用该类查找实例:

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"

这是一个很傻的例子,我把一些数据放到第一台机器上,然后第一台机器把它移动到第一台缓冲区,然后再移动到第二台机器。。。在

每台机器只是用它的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)

编辑

缓冲器现在也成了机器。在

既然您添加了有关该问题的更多信息,我将建议另一种解决方案。在

创建机器后,可能需要将它们链接在一起。在

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

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

我用“线程”这个词来描述像这样将对象链接在一起的过程。一个正在处理的项目在到达输出之前遵循从一台机器到另一台机器的线程。它有点模棱两可,因为它与执行线程无关,所以这个术语并不完美。在

相关问题 更多 >