2012-07-10 4 views
1

저는 파이썬을 처음 사용합니다. SimPy에서 기계 1 -> 버퍼 1 -> 머신 2 -> 버퍼 2 -> 등등과 같은 생산 라인을 모델링하는 시뮬레이션을 작성 중입니다 ...파이썬에서 같은 클래스의 다른 인스턴스를 호출하는 방법은 무엇입니까?

내 질문 : 클래스가 있습니다. , Machine (기계), 여러 인스턴스가 있습니다. 현재 인스턴스가 머신 2라고 가정합니다.이 인스턴스의 메소드는 머신 1 및 3의 상태에 영향을줍니다. 예 : 버퍼 2가 비어 있으면 머신 3은 유휴 상태입니다. 그러나 머신 2가 버퍼 2에 파트를 넣으면 머신 3이 활성화되어야합니다.

그래서 같은 클래스의 다른 인스턴스를 해당 클래스의 인스턴스에서 참조하는 방법은 무엇입니까? 또한 약간 다른 질문입니다 : 다른 클래스의 현재 인스턴스에서 객체 (이 경우 버퍼 1과 2)를 호출하는 방법은 무엇입니까?

편집 : 시스템에 대한 명확성을 추가하기 위해 편집 됨.

+4

코드 구조에 대한 자세한 정보를 제공해야합니다. 머신 2는 다른 머신이 전혀 존재하지 않는다는 것을 어떻게 알 수 있습니까? – BrenBarn

+1

해당 상태가 모든 시스템간에 공유되어 있습니까? 아니면 각 시스템마다 개별 상태가 있습니까? – phg

답변

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" 
+0

감사합니다. @steveha. 이것은 내가 찾고 있던 바로 그 것이다. 나는 MATLAB에서 코딩을 해왔으며, 이와 같은 작업을 아주 쉽게 수행 할 수있었습니다. OOP를 사용하면 쉽지 않습니다. 그러나 OOP의 다른 모든 기능을 고려할 때, MATLAB 코드를 Python으로 변환하지 않아도되는 더 나은 방법이 있다고 생각합니까? – user1509616

+0

글쎄, 아래의 다른 답변에서 논의 된 것처럼, 나는 당신이 명시 적으로 링크해야 할 개체를 연결해야한다고 생각합니다. @ mgilson의 대답이나 다른 대답을 사용하면 시뮬레이션을 빌드 할 기본 프레임 워크를 갖게됩니다. 그것은 깨끗하고 깔끔한 디자인이어야하며 machine0은 어떤 식 으로든 연결되지 않기 때문에 실수로 machine99을 망칠 수 없습니다. – steveha

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 

이제 당신은 동일한 작업을 수행하고 처리를하고 output()를 호출하는 m2에 넘겨 것이다, m1에 항목을 넘겨 다음, 그것의 처리를 할 것입니다 m0.input(item)를 호출 할 때. 이 예제는 동기 처리를 보여줍니다 (함수 호출이 반환되기 전에 항목이 체인을 통해 계속 전달됩니다). .input() 메서드는 항목을 처리 대기열에 넣은 다음 즉시 반환 할 수도 있습니다. 이 방법으로 기계 프로세스를 병렬 처리 할 수 ​​있습니다. 이 시스템

는 기계 사이의 연결을 명시하고, 각 시스템은 그 다음에 하나 (하나는 필요 그것이 알고하는)에 대해 알고있다.

"threading"이라는 단어를 사용하여 이와 같은 개체를 연결하는 프로세스를 설명합니다. 처리중인 항목은 출력에 도착하기 전에 기계에서 기계로가는 스레드를 따릅니다. 그것은 실행의 스레드와 아무 관련이 없기 때문에 약간 모호합니다. 그래서 그 용어는 완벽하지 않습니다.

+0

나는 보통 이런 종류의 프로세스에서 "파이프 라인"으로 생각합니다. 많은면에서 쉘 파이프 라인과 유사합니다. – mgilson

+0

"파이프 라인"은 "실행 스레드"와 혼동하지 않기 때문에 좋습니다. 나는 FORTH에서 일하곤했는데, 이것을 "threaded interpreted language"라고 부르기도합니다. 나는 그 책 표지에 바늘을 보여 주었는데 그 책 뒤에는 코드 블록을 연결하는 실이있었습니다. :-) – steveha

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) 

편집

버퍼는 지금 너무 기계이다.

+0

+1. 중요하지 않은 시뮬레이션의 경우 루프를 사용하여 모든 시스템과 버퍼를 연결하지 못할 수도 있습니다. 적어도 부분적으로 손으로 물건을 설치해야 할 수도 있습니다. 그러나 나는 그 접근 방식을 완전히 좋아합니다. 이렇게 제안했지만 컴퓨터와 버퍼를 모두 보여주지는 않았습니다. 당신은 여기에 여분의 마일을 갔고 매우 완전한 대답을했습니다. – steveha

+0

@steveha - 어떤 점에서 나는 당신을 더 좋아합니다 (+1). 예를 들어, def register_machine (self, machine)을 좋아한다는 것이 확실하지 않습니다. ('mybuff.machine = mymachine'은 잘 작동 할 것입니다. 그러나 기계 조각들을 모아서 찍을 때, 그것은 내 마음 속의 속성보다 기능이 더 좋습니다.) ... 나는 API가 어떻게 이 일을해야합니다. 그러나 어쨌든 우리 둘 다 똑같은 생각을하고있었습니다. 물론, 내가하기 전에 20 분 동안 대답했기 때문에 훨씬 더 빨리 생각했고 내 답변을 보지 못했습니다.) ... – mgilson

+0

글쎄, 전에 이런 종류의 코드를 작성했습니다. 나는 그들을 연결하는 과정을 설명하기 위해 "쓰레딩 (threading)"이라는 단어를 사용하는 경향이있다. 이것은 아마도 "스레드 시뮬레이션"이라고 부를 수 있습니다. – steveha

관련 문제