簡體   English   中英

如何在python中調用同一類的不同實例?

[英]How to call a different instance of the same class in python?

我是Python的新手。 我正在SimPy中編寫模擬以對生產線進行建模,如下所示:Machine 1-> Buffer 1-> Machine 2-> Buffer 2->依此類推。

我的問題:我有一個機器類,其中有幾個實例。 假設當前實例為機器2。此實例的方法影響機器1和3的狀態。例如:如果緩沖區2為空,則機器3為空閑。 但是,當機器2將零件放入緩沖區2中時,應該激活機器3。

那么,從該類的任何給定實例引用同一類的不同實例的方式是什么? 另外,還有一點不同的問題:從另一個類的當前實例調用對象(在這種情況下為緩沖區1和2)的方式是什么?

編輯:編輯以增加有關系統的清晰度。

一個類的實例了解該類的其他實例並不常見。

我建議您在類本身中保留某種實例集合,並使用該類查找實例:

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()方法將該項目放在隊列中進行處理,然后立即返回; 這樣,您可以使機器並行處理。

使用此系統,機器之間的連接是顯式的,並且每台機器僅知道其后面的機器(它需要知道的機器)。

我使用“線程”一詞來描述將對象鏈接在一起的過程。 在到達輸出之前,要處理的項目遵循機器之間的線程。 它有點模棱兩可,因為它與執行線程無關,因此該術語並不完美。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM