У меня есть этот синглет, я использую:
class MyThreadSafeSingleton(type):
def __init__(cls, name, bases, dictionary):
super(Singleton, cls).__init__(name, bases, dictionary)
cls._instance = None
cls._rlock = threading.RLock()
print("MyThreadSafeSingleton __init__")
def __call__(cls, *args, **kws):
with cls._rlock:
if cls._instance is None:
cls._instance = super(MyThreadSafeSingleton, cls).__call__(*args, **kws)
print("MyThreadSafeSingleton __call__")
return cls._instance
, и у меня есть простой класс, который использует его:
from utiils.singletone import MyThreadSafeSingleton
class Foo(object, metaclass=MyThreadSafeSingleton):
def __init__(self):
self.MyMemeber = 1
print("Foo __init__")
и в основном:
a = Foo().MyMemeber
b = Foo().MyMemeber
c = Foo().MyMemeber
d = Foo().MyMemeber
и печать:
MyThreadSafeSingleton __init__
Foo __init__
MyThreadSafeSingleton __call__
MyThreadSafeSingleton __call__
MyThreadSafeSingleton __call__
MyThreadSafeSingleton __call__
когда я запускаю его в IDE и устанавливаю точку останова в
self.MyMemeber = 1
, я вижу, что ввод только один раз, что заставляет меня думать, что конструктор вызвал только один раз.
но какой конструктор он вызывает, когда я делаю Foo (). MyMemeber? Я имею в виду "()" часть на Foo
что это тригер?
Спасибо