- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我见过几种在 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!