[Python-Dev] Submitting PEP 422 (Simple class initialization hook) for pronouncement
Guido van Rossum
guido at python.org
Mon Feb 11 22:44:05 CET 2013
On Mon, Feb 11, 2013 at 12:57 PM, PJ Eby <pje at telecommunity.com> wrote:
> On Mon, Feb 11, 2013 at 12:44 PM, Guido van Rossum <guido at python.org>
> wrote:
> > Hi Nick,
> >
> > I think this will make a fine addition to the language. I agree that
> > it is superior to the alternatives and fulfills a real (if rare) need.
> >
> > I only have a few nits/questions/suggestions.
> >
> > - With PJE, I think __init_class__ should automatically be a class
> > method.
>
> Actually, I didn't say that as such, because I'm not sure how the heck
> we'd implement that. ;-)
>
> For example, at what point is it converted to a classmethod? Is it
> going to be a slot method with special C-level handling? Handled by
> the compiler? What happens if somebody makes it a
>
> > The same way that __new__ is automatically a class method.
>
> Actually, isn't it automatically a staticmethod? Oh crap. Now that
> I'm thinking about it, doesn't this *have* to be a static method,
> explicitly passing in the class? I mean, otherwise, won't calling
> super().__init_class__() invoke it on the base class, rather than the
> current class?
>
> ISTM that EIBTI argues for the __new__/staticmethod approach,
> especially if you're returning the class (per below)
>
Let's see what Nick and the implementer say.
> > - Would it make any sense to require that __init_class__ *returns* the
> > new class object (to complete the similarity with class decorators)?
>
> It would certainly be quite useful to do so, but in that case, perhaps
> the method should be named __decorate_class__? And in that event the
> standard usage would look like:
>
> def __decorate_class__(cls):
> cls = super().__decorate_class__(cls)
> # do stuff
> return cls
>
> On the other hand, one could just drop the super() requirement and
> make the usage even simpler by having the class machinery walk the MRO
> and pass each method the result of invoking the previous one. Then
> the methods are short and sweet, and super() and __class__ don't come
> into it. (Though I guess the class machinery could keep setting
> __class__ to whatever the last-returned class was.)
>
> In his first draft, Nick implemented inheritable decorators instead,
> using a __decorators__ attribute in the class body, or something like
> that. While that approach had an issue or two of its own, it's
> possible that just going with a single __decorate_class__ method would
> work out better.
>
Half-baked idea: Maybe the base class __decorate_class__ would call the
class decorators? Or does that not make sense?
--
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130211/37ee2db3/attachment.html>
More information about the Python-Dev
mailing list