Является ли "первородным грехом" выполнение работы init в __new__? Если да, то как лучше всего справиться с запуском после инициализации для синглтонов?

У меня есть класс, который имеет стандартную синглтон-форму 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 __ () .У кого-нибудь есть идеи, как с этим лучше справиться?

5
задан Silas Ray 2 March 2012 в 18:27
поделиться