加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 自毁构造函数== Singleton?

发布时间:2020-12-20 13:46:34 所属栏目:Python 来源:网络整理
导读:我已经看到了一些用 Python创建单例的方法,但它们似乎都有一些缺点或其他缺点.我自己刚刚发明了一种方法,我想知道它有什么问题:). class Singleton(object): def __init__(self,cls,*args,**kwargs): self.instance = cls(*args,**kwargs) def blocked(doppe
我已经看到了一些用 Python创建单例的方法,但它们似乎都有一些缺点或其他缺点.我自己刚刚发明了一种方法,我想知道它有什么问题:).

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.instance


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


a = Singleton(A,10)

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

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

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

解决方法

它打破了继承:

class Singleton(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,20)将调用A .__ init__,它会引发异常.

编辑:为了澄清,您可能会认为“这是预期的.由于A是单身,我们不应该将它们子类化.”

但事情就是这样:

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

作品.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读