[英]Python: How to call an instance method from a class method of the same class
[英]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.