what exactly does type.__call__ do?

Steve D'Aprano steve+python at pearwood.info
Thu Nov 2 01:28:05 EDT 2017


On Thu, 2 Nov 2017 10:13 am, Jason Maldonis wrote:

> Hi everyone,
> 
> I want to use a metaclass to override how class instantiation works. I've
> done something analogous to using the Singleton metaclass from the Python3
> Cookbook example.

In my opinion, nine times out of ten, using a metaclass for something like
that is overkill.

(And that's putting aside the fact that 999 out of a thousand, using a
Singleton is the wrong solution, no matter what the question is.)


> However, I want to provide a classmethod that allows for "normal" class
> instantiation that prevents this metaclass from being used.

To me, that strongly suggests that a metaclass is the wrong solution.


> To do that, I think I just make a @classmethod constructor function.
> However, I can imagine a few different ways of writing this:
> 
> @classmethod
> def normal_constructor(cls, *args, **kwargs):
>     return type.__call__(*args, **kwargs)

Untested, but I think that should be:

    return type.__call__(cls, *args, **kwargs)


> @classmethod
> def normal_constructor(cls, *args, **kwargs):
>     return super(???).__call__(*args, **kwargs)  # I'm not sure what should
> go in the super here  (I'm using python3)
> 
> @classmethod
> def normal_constructor(cls, *args, **kwargs):
>     self = cls.__new__(cls)
>     self.__init__(*args, **kwargs)
>     return self
> 
> Is one of these correct? Or do they all do the same thing?

None of them look "correct", they all look "weird and scary" :-)

If I had to pick one of these three -- and I hope that I would not -- I'd pick
the first one.


> I was looking for documentation for what exactly `type.__call__` does so
> that I can emulate it, 

And then if type.__call__ changes, your emulation will be wrong.


> but I wasn't able to find any docs explicitly 
> detailing what that method does. If someone knows where this info is that
> would be great too.



-- 
Steve
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.




More information about the Python-list mailing list