Метод __call__
не такой, как вы думаете. Он предназначен для того, чтобы экземпляры классов вызывались как функции:
class A:
def __call__(self):
print("called")
a = A() # prints nothing
a() # prints "called"
То, что вы ищете, - это метод __new__
:
Вызывается создайте новый экземпляр класса cls.
Вы можете написать синглтон следующим образом (очень похоже на то, что вы написали):
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, *args, **kwargs):
print(self._instance, self)
a = Singleton()
b = Singleton()
Теперь вывод:
<__main__.Singleton object at 0x7f149bf3cc88> <__main__.Singleton object at 0x7f149bf3cc88>
<__main__.Singleton object at 0x7f149bf3cc88> <__main__.Singleton object at 0x7f149bf3cc88>