On 08/09/2017 03:39 PM, Ian Kelly wrote:
On Wed, Aug 9, 2017 at 2:20 PM, Ethan Furman wrote:
On 08/09/2017 12:59 PM, Ian Pilcher wrote:


I do want to prevent frozenset.__init__ from being called *again* when
an existing instance is returned, so I've decided to take this
approach:

      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


Whom do you think is going to call __init__ a second time?

The __call__ method of the metaclass. Here's an example using a singleton class:

--> Singleton()
__init__ called 1 times
<__main__.Singleton object at 0x76b54a717518>
--> Singleton()
__init__ called 2 times
<__main__.Singleton object at 0x76b54a717518>
--> Singleton() is Singleton()
__init__ called 3 times
__init__ called 4 times
True

Ah, cool!  I hadn't known about that particular side effect of singletons.

--
~Ethan~

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

Reply via email to