[Python-Dev] @decoration of classes
Nick Coghlan
ncoghlan at iinet.net.au
Thu Mar 31 02:05:51 CEST 2005
Michael Chermside wrote:
> So I'm inclined to use different tools for modifying functions and
> modifying classes because the ways you want to modify them are
> different, and decorators are "tuned" to what people normally want
> to do with functions (like simple wrapping) while metaclasses are
> "tuned" to what people normally want to do with classes (like support
> for inheritance.
The area where I can see an overlap is in those decorators which, rather than
altering the behaviour of the function itself, serve to register it with an
external framework of some description.
At the moment, a factory function that is actually implemented as a function can
be registered with such a system using an @decorator. If you use the
__new__/__init__ methods of a class as your factory, however, you need to either
post-decorate the class or create a metaclass that performs the registration.
It would be nice if decorators that worked for any callable (like the
registration example) could be easily used with classes as well as standard
functions. (The adaptation PEP's adapter registry is an actual situation that
comes to mind)
# A decorator that does not alter its argument
def register(callable):
# Register the callable somewhere
...
return callable
# Decorated factory function
@register
def factory():
pass
# Post-decorated class
class factory:
pass
register(factory)
# Metaclass
class RegisteredType(type):
def __init__(self, name, bases, dict):
super(self, RegisteredType).__init__(self, name, bases, dict)
register(self)
class factory:
__metaclass__ = RegisteredType
# Class decorator (not currently possible)
@register
class factory:
pass
PJE's example of moving the decoration near the top of the class definition
without allowing class decoration contains an important caveat: it requires that
the decorators be written to support doing that. Allowing class decoration means
any appropriate decorators can be used, unmodified, to affect classes as well as
functions.
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at email.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.skystorm.net
More information about the Python-Dev
mailing list