您可以将使用的实例保存在类属性中。
无论何时要重置类,请将新实例重新指派给该属性。
下面是我将如何实现这种方法:class Foo:
instance = None # The single instance
def __init__(self, ...):
# Initialize the instance if Foo.instance does not exist, else fail
if type(self).instance is None:
# Initialization
type(self).instance = self
else:
raise RuntimeError("Only one instance of 'Foo' can exist at a time")
@classmethod
def reset(cls):
cls.instance = None # First clear Foo.instance so that __init__ does not fail
cls.instance = Foo(...) # Now the initialization can be called
然后,您可以通过简单地引用Foo.instance来访问实例。
我选择将reset作为类方法,因此由@classmethod修饰。
使用这个decorator,可以通过调用Foo.reset()重置实例,并且cls参数将自动传递给该方法。
我更喜欢这种方法(或多或少是一种单例模式)而不是您建议的方法,因为在您的情况下,似乎有一个Foo的实例是合乎逻辑的,因为您希望重置它。
因此,我发现“强制”使用单个实例是相当直观的。
另一方面,可以在类之外有一个实例,并使用一个reset实例方法,定义如下:def reset(self):
self.__init__()
但这可能不太管用。
假设您想在__init__方法之外设置属性。
调用__init__不会重置这些属性。
因此,您的实例将不会按预期重置。
现在,如果您持有一个实例并将其重新分配给一个全新的实例,那么您肯定它将是绝对干净的。
关于您所说的“创建新实例”,这或多或少是我选择的,但问题是在哪里存储它。
我认为在课堂上保持温暖是有意义的。
顺便说一句,这个解决方案不应该有任何性能问题(如“内存泄漏”),因为一次只引用一个Foo实例,而创建一个新实例将取消对前一个实例的引用。