gpt4 book ai didi

python - 在 __new__ 中执行初始化工作是 'original sin' 吗?如果是这样,如何最好地处理单例的运行一次初始化?

转载 作者:太空狗 更新时间:2023-10-30 00:57:18 27 4
gpt4 key购买 nike

我有一个类,它具有我使用的标准 python 单例形式。它还初始化一个值,但不是在每个实例中初始化它,而是在我进行单例处理时在 __new__() 中初始化它。这是 pythonic 的方式吗?如果没有,我还能怎样?

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__() 中没有坏处,除了您正在运行的代码在不需要时实际上什么都不做,但是通常有一些我不想覆盖的可破坏状态值。我知道单例也是邪恶的,但有时,它们是最好的解决方案(比如定义我希望能够使用 is 检查的特殊使用类型)。

这似乎是我能想到的最佳解决方案,但我觉得在 __new__() 中初始化实例值很脏。有没有人知道如何更好地处理这个问题?

最佳答案

你总是可以使用全局变量而不是单例。具有三个不同实例的类的示例:

class _Ternary(object):
"""Internal class. Don't instantiate!"""
def __init__(self, value):
self.value = value

ternary_0 = _Ternary(0)
ternary_1 = _Ternary(1)
ternary_2 = _Ternary(2)

def ternary(value):
"""Factory function to request a "ternary" instance."""
return {0: ternary_0, 1: ternary_1: 2: ternary_2}[value]

这很简单,可以避免单例的痛苦。

关于python - 在 __new__ 中执行初始化工作是 'original sin' 吗?如果是这样,如何最好地处理单例的运行一次初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537617/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com