Using class attributes

Chris Rebert clp2 at rebertia.com
Mon Feb 15 14:53:46 EST 2010


On Mon, Feb 15, 2010 at 10:29 AM, Leo Breebaart <leo at lspace.org> wrote:
> I have a base class Foo with a number of derived classes FooA,
> FooB, FooC, etc. Each of these derived classes needs to read
> (upon initialisation) text from an associated template file
> FooA.tmpl, FooB.tmpl, FooC.tmpl, etc.
>
> I can derive the template filename string for each instance by
> doing something like this in the base class (and then not
> forgetting to call super() in the __init__() of each derived
> class):
>
>  class Foo(object):
>
>      def __init__(self):
>          self.template_filename = "%s.tmpl" % self.__class__.__name__
>          self.template_body = read_body_from(self.template_filename)
>
> But, since this information is the same for every instance of
> each derived class, I was wondering if there was a way to achieve
> the same thing outside of the __init__ function, and just have
> these assignments be done as a class attribute (i.e. so that I
> can refer to FooA.template_body, etc.)
>
> I can of course always just hardcode the template filenames in
> each derived class, but I am just curious if it can be automated
> through some form of introspection.

Metaclasses to the rescue!:

class WithTemplateAttrs(type):
    def __new__(cls, name, bases, dct):
        klass = type.__new__(cls, name, bases, dct)
        klass.template_filename = "%s.tmpl" % name
        klass.template_body = read_body_from(klass.template_filename)
        return klass

class Foo(object):
    __metaclass__ = WithTemplateAttrs
    #rest of class body here

Now just have FooA, FooB, etc. subclass Foo as before. They'll
automatically get the attributes generated.

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



More information about the Python-list mailing list