如何在Python中创建一个始终替换先前实例的单例?

问题描述 投票:0回答:1

我正在开发

pygame-ce
中的游戏作为一种爱好,为了场景管理,我实现了一个有限状态机。问题是,它目前只能工作,因为场景对象不会被垃圾收集,然后在“状态翻转”之间
reinitialized
。这会导致属性不被重置等。处理这个问题的最优雅的方法是将场景类定义为单例,除了它不会阻止新实例的创建,而是总是替换以前的实例.

这个想法应该是这样的,即伪代码:

class MySpecialSingleton:
instance = [0]
    def __init__(self):
        instance[0] = MySpecialSingleton.__init__

所以基本上当

MainMenu(MySpecialSingleton)
创建时,
Splashscreen(MySpecialSingleton)
就会被垃圾收集。

python singleton finite-state-automaton
1个回答
0
投票

您可能最好向该类添加一个函数来强制创建单例的新实例。

大致如下:


class YeetSingleton(object):
  _instance: "YeetSingleton" = None

  def __new__(cls, *args, **kwargs):
    if (cls._instance is None):
      # only create it if it doesn't exist
      cls._instance = super(YeetSingleton, cls).__new__(cls)
      # initialisation code here
    return cls._instance

  @classmethod
  def instance (cls):
    return cls._instance

  @classmethod
  def yeet(cls, *args, **kwargs):
    """
    this method gets gets rid of existing instance + replaces it
    :returns: new initialised instance
    """
    cls._instance = None # we can now make a new one
    return YeetSingleton(*args, **kwargs)

如果您想删除现有实例,只需调用

YeetSingleton.yeet()
,然后新实例将取代旧实例。

但是,您需要记住对旧单例对象的现有引用仍然会引用该对象

© www.soinside.com 2019 - 2024. All rights reserved.