2016-10-09 2 views
0

파이썬 새내기 질문 : 클래스 메서드 인 경우 콜백 메서드 handlePackets이 호출되지 않습니다. 클래스에 없다면 제대로 작동합니다. 내가 무엇을 할 수 있을지?클래스 메서드 인 경우 콜백이 호출되지 않습니다.

class Receiver: 

    def __enter__(self): 
     self.serial_port = serial.Serial('/dev/ttyUSB0', 115200) 
     self.xbee = ZigBee(self.serial_port, escaped=True, callback=self.handlePackets) 
     Logger.info('Receiver: enter') 
     return self 

    def __exit__(self ,type, value, traceback): 
     Logger.info('Receiver: exit') 
     self.serial_port.close() 

    def handlePackets(data): 
     Logger.info('Receiver: packet incoming') 
+0

컨텍스트 관리자로 사용하려고합니까? 그러면 그것들은'__enter__'과'__exit__'이어야합니다. 그렇지 않으면 어떤 코드가'enter'를 호출합니까? – tdelaney

+0

그들은 있습니다. 게시물에서 수정 됨. – wackazong

+0

예전 스타일의 클래스에는 문제가있을 수 있습니다. 파이썬 2.7에서'class Receiver (object) :'클래스를 선언하십시오. – tdelaney

답변

0

나는 ZigBee 내에서 콜백을 호출 무엇이든이 자동으로 실패, 때문입니다 내기 할 수있다. 인터프리터는 2 개의 매개 변수로 함수를 호출하지만 정의한대로 하나만 사용합니다.

def handlePackets(self, data): 
       #^^^^ 
+0

handlePackets를 전역으로 만들면 잘 돌아갑니다. – wackazong

+0

네, handlePackets' 콜백이'self.handlePacket'으로 전달 될 때 첫 번째 매개 변수에'self'를 전달해야하기 때문에 * 아마 * *입니다. – SuperSaiyan

+0

@tdelaney : 아니요. 무슨 일이 일어나는지 스스로 테스트 코드를 실행하십시오. Gist :'self.handlePacket'이라고하면, 첫 번째 매개 변수를'self' 나 클래스의 인스턴스에 바인딩합니다. 그런 다음 두 번째 매개 변수로 호출하면 두 번째 매개 변수에 바인딩됩니다. 따라서 2 개의 매개 변수가 필요합니다. – SuperSaiyan

0

나는 packetHandler에 첫 번째 매개 변수로 self을 추가해야했습니다. 이것은 모든 클래스 메서드에 필요하며 그것을 넣는 것을 잊었습니다.

관련 문제