1

私はPythonが初めてです。SimPy でシミュレーションを作成して、マシン 1 -> バッファー 1 -> マシン 2 -> バッファー 2 -> などの生産ラインをモデル化しています。

私の質問: 私はいくつかのインスタンスがある Machine クラスを持っています。現在のインスタンスがマシン 2 であるとします。このインスタンスのメソッドは、マシン 1 と 3 の状態に影響します。たとえば、バッファ 2 が空の場合、マシン 3 はアイドル状態です。しかし、Machine 2 がパーツを Buffer 2 に入れると、Machine 3 がアクティブになるはずです。

では、そのクラスの任意のインスタンスから同じクラスの異なるインスタンスを参照するにはどうすればよいでしょうか? また、少し異なる質問: 別のクラスの現在のインスタンスからオブジェクト (この場合はバッファー 1 と 2) を呼び出す方法は何ですか?

編集:システムについてより明確にするために編集されました。

4

3 に答える 3

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"
于 2012-07-10T19:26:45.763 に答える
3

これは、最初のマシンにいくつかのデータを入れ、それを最初のバッファに移動し、次にそれを 2 番目のマシンに移動するという、私が作成したばかげた例です ...

各マシンは 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)

編集

バッファもマシンになりました。

于 2012-07-10T19:57:45.483 に答える
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()メソッドでアイテムを処理のためにキューに入れ、すぐに返すこともできます。このようにして、マシンを並行して処理させることができます。

このシステムでは、マシン間の接続は明示的であり、各マシンはそれに続くマシン (知る必要があるマシン) のみを認識します。

このようにオブジェクトをリンクするプロセスを「スレッド化」という言葉で表現しています。処理中のアイテムは、出力に到達する前にマシンからマシンへとスレッドに従います。実行のスレッドとは関係がないため、少しあいまいです。そのため、その用語は完全ではありません。

于 2012-07-10T19:38:12.507 に答える