我试图用Python实现一个singleton,在阅读了this post之后,我发现自己比以前更加困惑。答案太多了,其中许多人得到了他们应得的票数。现在的问题可能不是我有一个singleton,而是状态只需要初始化一次。我尝试了两个实现SingletonA
和SingletonB
,但我无法管理它来工作。对于我真正的问题,__init__
函数非常重,所以我只需要做一次。到目前为止,我得到的是:
class ClassA:
def __init__(self):
# some state
print("Creating state in A")
self.X = 1.
self.Y = 2.
class SingletonA(ClassA):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(SingletonA, cls).__new__(
cls, *args, **kwargs)
return cls._instance
class ClassB:
__shared_state = {}
def __init__(self):
if not bool(ClassB.__shared_state):
# some state
print("Creating state in B")
self.X = 1.
self.Y = 2.
self.__dict__ = self.__shared_state
def singleton(cls):
obj = cls()
# Always return the same object
cls.__new__ = staticmethod(lambda cls: obj)
# Disable __init__
try:
del cls.__init__
except AttributeError:
pass
return cls
@singleton
class SingletonB(ClassB):
pass
if __name__ == "__main__":
a1 = SingletonA()
a2 = SingletonA()
if (id(a1) == id(a2)):
print("Same",a1.X, a1.Y)
else:
print("Different",a1.X, a1.Y)
b1 = SingletonB()
b2 = SingletonB()
if (id(b1) == id(b2)):
print("Same",b1.X, b1.Y)
else:
print("Different",b1.X, b1.Y)
现在打印:
^{pr2}$我确实有一个singleton类,但我想避免创建state。在
如果我没听错,这就是你所需要的:
所有实例将共享相同的数据,并且此数据将只计算一次。在
请注意,您可以在读取时将共享数据称为
self._shared_dict
,但写入时必须使用类属性self.__class__._shared_dict
的全名。在这无法工作,因为
__init__
方法是在对象创建之后通过__new__
调用的。从Python Language Reference提取您应该有一个与
__init__
不同的特殊初始化方法,并在_instance
创建时调用。在代码可以是(不需要父类,所以我省略了它):
但实际上,您只需在声明时构建实例:
^{pr2}$这两种方式都会导致以下输出(对于单件零件):
完全删除
__init__
方法将导致一次初始化。在注释版本可以是:
简单地将单例实例存储在类本身中
相关问题 更多 >
编程相关推荐