У меня есть класс, который имеет стандартную синглтон-форму Python, которую я использую. Он также вводит одно значение, но вместо того, чтобы инициализировать его в каждом экземпляре, я инициализирую его в __ new __ ()
, когда выполняю обработку синглтона. Это питонический способ сделать это? Если нет, то как еще я могу?
class Foo(object):
_inst = None
def __new__(cls, val):
if Foo._inst is None:
Foo._inst = super(Foo, self).__new__(cls)
Foo._inst.val = val
return Foo._inst
Очевидно, это упрощенная форма. Я использовал конструкцию ожидания до __ init __ ()
, чтобы проверить и установить Foo._inst
для обработки запуска после инициализации для синглтона, но это кажется готовым для ошибок синхронизации в многопоточной ситуации . В ситуациях, когда в существующем экземпляре нет значений, которые могут быть повреждены при повторном запуске __ init __ ()
, нет ничего плохого в том, чтобы поместить init в __ init __ ()
, за исключением того, что вы запускаете код, который фактически ничего не делает, когда вам это не нужно, но часто бывают искаженные значения состояния, которые я не хочу перезаписывать. Я знаю, что синглтоны тоже зло, но иногда они являются лучшим решением (например, определение специальных типов использования, которые я хочу проверить с помощью , равно
).
Это кажется лучшим решением, которое я могу придумать, но я чувствую грязную инициализацию значений экземпляра в __ new __ ()
.У кого-нибудь есть идеи, как с этим лучше справиться?