网上流传最广的 Python 单例模式竟然是有问题的?

wuwukai0073天前0

class AppConfig:    def __new__(cls, *args, **kwargs):        if not hasattr(cls,'_instance'):            cls._instance=super(AppConfig,cls).__new__(cls)        return cls._instanceapp = AppConfig()app.name = '单例模式'del appapp2 = AppConfig()print("app2 name=",app2.name)
输出 app2 name= 单例模式
虽然是单例,但是我可以删除对象的,删除后重新创建对象,还是老的对象
最新回复 (20)
  • leavic3天前
    引用2
    我今天才知道 python 还有 del app 这种写法
  • dcsuibian3天前
    引用3
    作用域不同。
  • dcsuibian3天前
    引用4
    似乎说法不太对。app 和 AppConfig 类的_instance 都引用一个东西,app 这个引用消失了,但引用的东西没消失
  • Hstar3天前
    引用5
    因为 del app 并没有删除对象,只是删掉了这个对象在此的引用
  • cz54243天前
    引用6
    del app 并且 del app. _instance 试试
  • 楼主wuwukai0073天前
    引用7
    @cz5424 这个代码一致性就破坏了
  • 你要手动实现__del__
  • 楼主wuwukai0073天前
    引用9
    @ChrisFreeMan 试过了,不行的,你试试看?__del__ 只有在程序结束后才会调用,del 不会调用的
  • 引用10
    这个问题如果用过 pyqt 应该会映像深刻。。。
    个人理解 del 实质上没有删除对象的存在,有时会导致 pyqt 删除 gui 时出问题。
  • deplivesb3天前
    引用11
    python 里面的 del 可和 c 系列的 del 不是一个作用,del 也不会调用 __del__
  • fatigue3天前
    引用12
    _instance 是挂在类下面的, 你 AppConfig()的时候把这个引用返回给你,你 del 的时候把这个引用删除,_instance 一直都在,下次 AppConfig()再返回给你
  • 引用13
    __del__试了下确实不行,这样,其实你是把单例对象赋值给了类,其实那个单例对象是个类对象
    你用反射检查一下有没有单例对象再删除。
    class Test:
    def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
    cls._instance = super().__new__(cls)
    return cls._instance
    app = Test()
    app.name = 'some thing1'
    if hasattr(Test, '_instance'):
    del Test._instance
    app2 = Test()
    print(app2.name)
  • ysy9508033天前
    引用14
    依附于类,而不是对象。
  • jinliming23天前
    引用15
    单例模式允许删除重新创建吗?
    我理解的单例模式,一个类只能有一个对象,其他人来访问的时候可以直接拿到这个对象。
    但没听说过还能有人可以删除掉这个单例对象,然后让重新创建一个……?
  • ospider3天前
    引用16
    除了面试,没用过单例模式……
  • ruanimal3天前
    引用17
    lz 没理解 del 和 Python 对象,4 楼的是正解
  • zxCoder3天前
    引用18
    @jinliming2 我也没听说过,之前学过的都是你这种说法
  • xuboying3天前
    引用19
    好像 del 的行为只是一个请求,实际删除 instance 的时机是不可控的。即使用了 weakref ,在官方例子中还调用了 gc 回收,才能强制请求删除。
    还有一个问题是不确定这个行为在非 cPython 的环境下是不是一致的。
  • lanlanye3天前
    引用20
    Python 最流行的单例模式难道不是直接初始化然后 import ?
  • https://stackoverflow.com/questions/6760685/creating-a-singleton-in-python 里面提供了几种思路。
  • 游客
    22
返回