class Singleton(object): def __init__(self,cls,*args,**kwargs): self.instance = cls(*args,**kwargs) def blocked(doppelganger,**kwargs): raise RuntimeError("singleton") cls.__init__ = blocked def getInstance(self): return self.instanceclass A(object): def __init__(self,x): self.x = xa = Singleton(A,10)
这是通过将一个类交给Singleton然后实例化它,然后通过使其构造函数引发运行时异常来阻塞它.我可以看到的主要缺点是这种模式只会阻止创建更多实例,但不能保证只有一个实例.它也可以扼杀任何一个类,这可能是一个坏主意.
这两个缺点可以通过将行为取消抽象到想要成为单例的每个类来解决.例如,阻止的定义及其对self .__ init__的赋值可以是A的构造函数的最后一行.然后A只能被实例化一次,尽管其他一些机制需要将单个实例放在客户端可以到达的地方.
这种方法还有其他缺点吗?
解决方法 它打破了继承:class Singleton(object): def __init__(self,x): self.x = xclass B(A): def __init__(self,x,y): super(B,self).__init__(x) self.y = ya = Singleton(A,10)b = Singleton(B,10,20) # Raises RuntimeError
在这种情况下:Singleton(B,20)将调用A .__ init__,它会引发异常.
编辑:为了澄清,您可能会认为“这是预期的.由于A是单身,我们不应该将它们子类化.”
但事情就是这样:
b = Singleton(B,20)a = Singleton(A,10)
作品.
总结以上是内存溢出为你收集整理的python – 自毁构造函数== Singleton?全部内容,希望文章能够帮你解决python – 自毁构造函数== Singleton?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)