gpt4 book ai didi

python - 自毁构造函数 == 单例?

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:06 33 4
gpt4 key购买 nike

我见过几种在 Python 中创建单例的方法,但它们似乎都有一些缺点。我自己发明了一种方法,我想知道它有什么问题:)。

class Singleton(object):
def __init__(self, cls, *args, **kwargs):
self.instance = cls(*args, **kwargs)

def blocked(doppelganger, *args, **kwargs):
raise RuntimeError("singleton")

cls.__init__ = blocked

def getInstance(self):
return self.instance


class A(object):
def __init__(self, x):
self.x = x


a = Singleton(A, 10)

这通过将一个类交给 Singleton 来实现,然后实例化它,然后通过使其构造函数引发运行时异常来阻止它。我看到的主要缺点是这种模式只会阻止创建更多实例,但不能保证只有一个实例。它还可能阻碍任何类(class),这可能是个坏主意。

这两个缺点可以通过将行为取消抽象到每个想要成为单例的类中来解决。例如,blocked 的定义及其对 self.__init__ 的赋值可以是 A 构造函数的最后几行。然后 A 只能被实例化一次,尽管一些其他机制需要将单个实例放置在客户端可以访问它的地方。

这种方法还有其他缺点吗?

最佳答案

它破坏了继承:

class Singleton(object):
def __init__(self, cls, *args, **kwargs):
self.instance = cls(*args, **kwargs)

def blocked(doppelganger, *args, **kwargs):
raise RuntimeError("singleton")

cls.__init__ = blocked

def getInstance(self):
return self.instance


class A(object):
def __init__(self, x):
self.x = x


class B(A):
def __init__(self, x, y):
super(B, self).__init__(x)
self.y = y


a = Singleton(A, 10)
b = Singleton(B, 10, 20) # Raises RuntimeError

在这种情况下:Singleton(B, 10, 20),将调用 A.__init__ 引发异常。

编辑:为了澄清,您可能会想“这是意料之中的事情。因为 A 是单例,我们不应该将它们子类化。” p>

但事情是这样的:

b = Singleton(B, 10, 20)
a = Singleton(A, 10)

有效。

关于python - 自毁构造函数 == 单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574129/

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