On Sun, Feb 10, 2013 at 11:48 AM, Stefan Behnel <stefan...@behnel.de> wrote:
> So, the way to explain it to users would be 1) don't use it, 2) if you
> really need to do something to a class, use a decorator, 3) if you need to
> decide dynamically what to do, define __init_class__() and 4) don't forget
> to call super's __init_class__() in that case, and 5) only if you need to
> do something substantially more involved and know what you're doing, use a
> metaclass.

I'd revise that to:

1) if there's no harm in forgetting to decorate a subclass, use a
class decorator
2) if you want to ensure that a modification is applied to every
subclass of a single common base class, define __init_class__ (and
always call its super)
3) If you need to make the class object *act* differently (not just
initialize it or trigger some other side-effect at creation time), or
if you want the class suite to return some other kind of object,
you'll need a metaclass.

Essentially, this change fixes a hole in class decorators that doesn't
exist with function decorators: if you need the decoration applied to
subclasses, you can end up with silent failures right now.
Conversely, if you try prevent such failures using a metaclass, you
not only have a big hill to climb, but the resulting code will be
vulnerable to metaclass conflicts.

The proposed solution neatly fixes both of these problems, providing
One Obvious Way to do subclass initialization.

(An alternative, I suppose, would be to let you do something like
@@someClassDecorator to have inheritable class decorators, but as Nick
has pointed out, implementing inheritable decorators is a lot more
complicated.)
_______________________________________________
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