2016-10-09 3 views
0

Вопрос о новинке Python: метод обратного вызова handlePackets никогда не вызывается, если это метод класса. Если он не в классе, он работает нормально. Что я могу сделать?Callback не вызывается, если это метод класса

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

Я думаю, что это возможно, что есть проблемы со старыми классами. В python 2.7 объявите класс 'Receiver (object) класса:'. – tdelaney

ответ

0

Я могу поспорить, что это происходит потому, что все, что звонит обратный вызов внутри ZigBee не удается молча. Интерпретатор вызывает вашу функцию с двумя параметрами, но, как вы ее определили, она принимает только одну.

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

Когда я делаю handlePackets global, он работает отлично. – wackazong

+0

Да, это * возможно * потому что, когда вы вызываете обратный вызов 'handlePackets' как' self.handlePacket', вам необходимо передать 'self' в первом параметре. – SuperSaiyan

+0

@tdelaney: Нет. Пожалуйста, запустите тестовый код самостоятельно, чтобы узнать, что произойдет. Gist: когда вы говорите: 'self.handlePacket', вы привязываете первый параметр к' self' или экземпляру класса. Затем во второй раз, когда вы вызываете его одним параметром, вы привязываетесь ко второму параметру. Поэтому вам нужны 2 параметра. – SuperSaiyan

0

Я должен был добавить self в качестве первого параметра для пакетаHandler. Это необходимо для всех методов класса, и я забыл поместить его.

Смежные вопросы