Hi all.

I was wandering why Python implements its __new__ method as a static and not a class method?

__new__ always accepts a cls parameter, which lead me to believe it was a class method. Also, implementing __new__ as a class method seems natural when thinking about __new__ as 'a method you call on a class to create a new instance of that class'.

The difference between the two implementations is admittedly not that significant. In most cases __new__ would still need to have its cls parameter explicitly specified since it is most often called on a class and not on an instance.

  Having it implemented as a class method would allow this:

    class X:
      def __new__(cls, x):
        return super().__new__(x)

  instead of having to do this, as we do now:

    class X:
      def __new__(cls, x):
        return super().__new__(cls, x)


Thinking about this some more - I guess having it as a static method allows you to use super() and still create a new 'subclass' when asked to instantiate a base class. Perhaps some sort of a factory pattern implementation like so:

    class Base:
      def __new__(cls, x):
        actual_class = get_class_for(x)
        return super().__new__(actual_class, x)

If __new__ were a class method, the same logic could not be so easily implemented as you would need to call __new__ on actual_class, and so each actual_class would need to implement its own __new__ skipping its direct parent's __new__ - yuck... what a mess...

Could that be the actual use case causing Guido to model __new__ as a static method? Or was it something else?


I'm not suggesting this be changed, of course. I'm just curious as to whether I'm not fully understanding something in this part of Python. I generally find Python highly intuitive and it's not often something about it takes me by surprise like this. :-)

  Thanks in advance.

  Best regards,
    Jurko Gospodnetić

P.S.
Normally, I'd chalk this issue up under 'bike-shedding', but it came up while teaching others about Python and so does not feel right leaving it as 'because that's the way it is'. :-)

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to