[Python-Dev] Class decorators

Phillip J. Eby pje at telecommunity.com
Tue Mar 28 04:23:50 CEST 2006


At 07:20 PM 3/27/2006 +0000, Mike Krell wrote:
>Greg Ewing <greg.ewing <at> canterbury.ac.nz> writes:
>
> >
> > I've just been playing around with metaclasses, and
> > I think I've stumbled across a reason for having
> > class decorators as an alternative to metaclasses
> > for some purposes.
>
>There has also been discussion on the IronPython mailing list that class
>decorators would be a very useful syntax for expressing .NET attributes.
>
>http://lists.ironpython.com/pipermail/users-ironpython.com/2006-March/002007.html 
>

PyProtocols and the zope.interface package both support inline class 
decorators called "class advisors".  They don't require any special syntax, 
and aren't much more complex than regular decorators.  By defining an 
advisor like this:

    from protocols.advice import addClassAdvisor

    def some_advisor(whatever_args):
        def callback(cls):
            print "I can modify",cls,"or replace it"
            return cls
        addClassAdvisor(callback)

you can then use it in a class body like so:

     class SomeClass:
         some_advisor("something")

And the return value from 'callback' will replace SomeClass, just like a 
decorator replaces the function it's called on.

The implementation should work with any Python version from 2.2 up.  I'm 
not sure if it would work with IronPython.  But if it doesn't, that would 
be a good indication of feature(s) that IronPython is missing.  ;)



More information about the Python-Dev mailing list