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   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
            http://boredomandlaziness.skystorm.net
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to