Inheritance question

Peter Otten __peter__ at web.de
Mon Sep 20 12:41:20 EDT 2004


Yannick Turgeon wrote:

> Hello,
> 
> Thanks to reply. My question has been answered but I'm now wondering if I
> do this the best way.
> 
> In the real situation I'm implementing a protocol. "A" represent a
> command. Say "0144AYHR78" (encoded data) means "Add client Joe" and
> "0589UAWERT" means "Ship 3 compressors to Joe". What I want to do is to
> create a "A" instance which find the command type and parameters and
> "mutate" itself to the good command. All command parameters ("Joe" for the
> first one and "3,compressor,Joe" for the secondeone) are kept in a sigle
> list.So B1 and B2 would define the function "getClient()" and B2 would
> define "getQty()" and "getProduct()" and some other command-specific work.
> 
> while True:
>     encoded_data = readEncodedData()
>     command = A(encoded_data)
>     type_ = command .getType()    # Define in "A"
>     if type_ == A.ADD:
>         # Do what I have to do with a "Add" command using the "command"
> instance (B1)
>     elif type_ == A.SHIP:
>         # Do what I have to do with a "Ship" command using the "command"
> instance (B2)
>     ...
> 
> Any suggestion to do this in a better way

Here's how I would do it based on the above:

class Ship:
    def __init__(self, args):
        """ knows how to decode args """
        self.quantity = # your code
        self.item = # your code
        self.client = # your code
    def execute(self):
        """ do what is necessary for shipment """

class Add:
    def __init__(self, args):
        """ knows how to decode args """
        self.client = # your code
    def execute(self): 
        """ add a client """

commands = {
    "0144": Add, # assuming the first 4 chars encode the command
    "0589": Ship,
}

def decode(data):
   """ separate the command and its arguments,
       hopefully possible without having to know
       individual commands
   """ 
   return data[:4], data[4:] # may actually be more complicated

while True:
    type_, args = decode(readEncodedData())
    cmd = commands[type_](args)
    cmd.execute()

Ship and Add may or may not share a common base class depending on whether
you can factor out common functionality - e. g. a mixin that knows how
decode the client, but you do not need to artificially introduce a common
base class as a factory for the actual instances. Just make sure that
__init__() takes a single argument and an execute() method taking no
arguments is available.
The client code (the while loop) is independent of the actual command, so
ideally you just have to create a new class for a new command and enter it
into the commands dictionary.

Peter




More information about the Python-list mailing list