__new__ and __init__ - why does this work?

Ian Pilcher arequipeno at gmail.com
Wed Aug 9 14:44:44 EDT 2017


On 08/08/2017 10:19 PM, Ian Kelly wrote:
> It's initialized by the superclass call to __new__. frozenset is
> immutable, and __init__ methods of immutable types generally don't do
> anything (if they could, then they wouldn't be immutable), which is
> why it doesn't really matter that you didn't call it. At the same
> time, it generally doesn't hurt to call it, and you probably shouldn't
> even have an override of __init__ here if it doesn't do anything.

Thanks for the explanation.

I'll admit that I'm a bit paranoid about the potential effects of
"re-__init__-ing" an object, at least in the general case.  What do
you think of this?

     def __new__(cls, *args, **kwargs):
         self = super(UniqueSet, cls).__new__(cls, *args, **kwargs)
         self._initialized = False
         return UniqueSet._registry.setdefault(self, self)

     def __init__(self, *args, **kwargs):
         if not self._initialized:
             super(UniqueSet, self).__init__(self, *args, **kwargs)
             self._initialized = True

> It seems a bit inefficient that you create *two* sets in __new__ and
> then map one of them to the other in your registry. Why not just
> create the UniqueSet and then map it to itself if it's not already
> registered? Something like this (untested):
> 
> def __new__(cls, *args, **kwargs):
>      self = super(UniqueSet, cls).__new__(cls, *args, **kwargs)
>      return UniqueSet._registry.setdefault(self, self)

That was mainly me being unfamiliar with the frozenset API (and not
overly concerned about the size of the _registry, since I expect that
there will be a very small number of entries).  Your version is much
more elegant.

Thank you!

-- 
========================================================================
Ian Pilcher                                         arequipeno at gmail.com
-------- "I grew up before Mark Zuckerberg invented friendship" --------
========================================================================




More information about the Python-list mailing list