Ну, я никогда не чувствовал необходимости использовать такую вещь в Python - и большинство знакомых мне программистов Python тоже не искали что-то подобное. У меня сложилось впечатление, что объекты Python в целом легкие, и было бы лучше создать их много и избежать врожденных проблем с изменяемыми объектами, чем использовать синглтоны для оптимизации.
В любом случае, если кто-то действительно хочет какой-то синглтон, обычным способом является создание значения в модуле:
# Module stuff.py
class Stuff(object):
# ....
pass
singleton = new Stuff()
Тогда вы используете это:
import stuff
stuff.singleton.do_something()
Вы можете даже, скажем, заменить значение в модуле, как если бы вы поменяли местами applicationContext.xml
файлы Spring. Это может быть полезно в тестах, например:
import stuff
stuff.singleton = MockedStuff()
class MyTestCase(TestCase):
def testMockStuff(self):
# Component can be a class which uses the singleton
component = Component()
# Proceed with tests
На самом деле, вы можете издеваться даже над всем классом:
import stuff
stuff.Stuff = MockedStuff
class MyTestCase(TestCase):
def testMockStuff(self):
# Component creates some instance of stuff.Stuff, which is mocked now
component = Component()
# Proceed with tests
Подводя итог: ИМХО, программисты на Python не чувствуют необходимости чего-то вроде Spring DI. Если кому-то нужна функциональность Spring DI, его легко реализовать с помощью чистого кода Python.
(Есть пункты, основанные на моем опыте. Я уверен, что больше людей могут указать другие причины.)