Move dictionary from instance to class level

Chris Rebert clp2 at rebertia.com
Wed Aug 26 04:54:05 EDT 2009


On Wed, Aug 26, 2009 at 1:22 AM, Frank Millman<frank at chagford.com> wrote:
> Hi all
>
> I have a class that uses a dictionary to map message numbers to methods.
>
> Here is a simple example -
>
>    class MyClass(object):
>        def __init__(self):
>            self.method_dict = {}
>            self.method_dict[0] = self.method_0
>            self.method_dict[1] = self.method_1
>
>        def on_message_received(self, msg):
>            self.method_dict[msg]()
>
>        def method_0(self):
>            print 'in method_0'
>
>        def method_1(self):
>            print 'in method_1'
>
> I have quite a few methods, so the dictionary is growing - up to 28 methods
> so far. To avoid
> having to recreate the dictionary every time I create an instance of the
> class, I tried to move it
> up to the class level. Unfortunately it does not work. This is what I
> tried -
>
>    class MyClass(object):
>        method_dict = {}
>        method_dict[0] = method_0  # this gives an error
>        method_dict[1] = method_1
>
>        def on_message_received(self, msg):
>            self.method_dict[msg]()
>
>        def method_0(self):
>            print 'in method_0'
>
>        def method_1(self):
>            print 'in method_1'
>
> As written above, I get the following error -
>    NameError: name 'method_0' is not defined
>
> If I try self.method_0, I get 'self' is not defined.

Right, because you're in the *class* body; there's no "current
instance" to be "self"; in fact, there's not even any class for there
to be instances of yet.

> If I try __class__.method_0, I get '__class__' is not defined.

Right, because the class isn't created until its body has finished executing

> If I try MyClass.method_0, I get 'MyClass' is not defined.

See previous note. The class name can't be bound to anything until the
class itself has been created.

> Is there any variation on this theme that will work?
>
> #----------------------------------------------------
>
> Ok, I found a variation that seems to work.
>
> Is this the preferred way, or is there a better alternative?

A

class MyClass(object):
    def on_message_received(self, msg):
        self.method_dict[msg](self)

    def method_0(self):
        print 'in method_0'

    def method_1(self):
        print 'in method_1'
        method_dict

    method_dict = {0: method_0, 1: method_1}
    #note this comes *after* the methods in question have been defined

Is there some reason you aren't using a list instead of a dict?
e.g. method_dict = [method_0, method_1, method_2, etc]

For that matter, why are you associating methods with integers in the
first place?

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list