python: вызов производного __init__ из базового класса, проблема с несколькими конструкторами - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь выполнить декодирование протокола в Python.

Краткая версия моего вопроса:

  • Я получил массив байтов, который является пакет данных.

    • Используя первый байт пакета, я знаю, какой это тип пакета.
    • Используя это - я хочу создать пакет через класс.
  • Когда я хочу отправить пакет, мне действительно нужно повторно использовать около 90% обработки, выполненной в том же классе пакетов, чтобы я мог создать и отправить пакет.

Я могу сделать одно из вышеперечисленного, кажется, я не могу сделать оба

Например - что-то вроде этого:


class PacketType123(BasePacketType):

    def __init__fromparams( self, field1, field2 ):
        # called when you want to send a packet
        # ... initialize like I'am sending the packet
        self.field1 = field1
        self.field2 = field2

    def encode_and_send(self,destination):
        # encode into raw byte
        databytes = self.encode()
        destination.send( databytes )

    # called when a packet is received on the wire
    def __init__frombytearray( self, bytearray ):
        self.decode_bytearray( bytearray )
        print("Hi Field2 = %d" % self.field2 )

# create packet decode lookup table.
lookuptable = dict()
# populate it with classes
lookuptable[123] = PacketType123
# other packets would added to the lookup table
lookuptable[44] = PacketType44
lookuptable[12] = PacketType12

Отправить

   p1 = PacketType1( 42, "dogs and cats" )
   p1.encode_and_send( server )

Чтобы обработать поступающие данные, сделайте следующее:

   databytes = receive_message()

   packet = lookuptable[ datbytes[0] ].__init__frombytearray(databytes)

Моя проблема в том, что я могу сделать либо ToSend, либо ProcessIncomming, я не знаю, как сделать оба с тот же класс.

Я просмотрел:

Кажется, Единственный способ сделать эту работу - с помощью ключевых слов args. Тьма, которая усложняет мне другие вещи ... Ищете другой способ сделать это.

Предложения, пожалуйста?

...