我正在开发
pygame-ce
中的游戏作为一种爱好,为了场景管理,我实现了一个有限状态机。问题是,它目前只能工作,因为场景对象不会被垃圾收集,然后在“状态翻转”之间 reinitialized
。这会导致属性不被重置等。处理这个问题的最优雅的方法是将场景类定义为单例,除了它不会阻止新实例的创建,而是总是替换以前的实例.
这个想法应该是这样的,即伪代码:
class MySpecialSingleton:
instance = [0]
def __init__(self):
instance[0] = MySpecialSingleton.__init__
所以基本上当
MainMenu(MySpecialSingleton)
创建时,Splashscreen(MySpecialSingleton)
就会被垃圾收集。
您可能最好向该类添加一个函数来强制创建单例的新实例。
大致如下:
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()
,然后新实例将取代旧实例。
但是,您需要记住对旧单例对象的现有引用仍然会引用该对象。