Blog Archives

Python decorator classes and __call__

Decorators in Python are a very powerful feature that I'm still learning to wrap my head around. While working on one of my projects I wanted to use a decorator to 'register' the decorated object, which is pretty easy:

def register(func):
    pass

class Sample:
    @register
    def method(self):
         # register this method
         pass

This worked great, except I realized I needed to pass the function that was being registered and another parameter that I was able to sometimes figure out automatically. In the cases when I was unable to figure it out, I need to pass the parameter with the decorator, so I changed the decorator to a class:

class register:
    def __init(self, param=None):
         self.param = param

    def __call__(self, func):
         pass

This worked great -- I was able to set param to what I needed, but I had trouble with my old code. It took me a little bit to realize that __call__ was not being ... called. I needed to change the code to use @register():

class Sample:
    @register()
    def method(self):
         # register this method
         pass

After looking for at several examples, it was sort of "by accident" that I found this. It may well be documented, but I certainly missed it: if you use decorator classes, you need to explicitly call your decorator!

Posted: March 09, 2009 @ 22:00
Tagged: code, python, tech

Comments

No comments have been added