你可以将你使用的实例保存在一个类属性中。
每当你想要重置这个类时,重新分配一个新的实例给这个属性。
以下是我实现此方法的方式:
class Foo:
instance = None
def __init__(self, ...):
if type(self).instance is None:
type(self).instance = self
else:
raise RuntimeError("Only one instance of 'Foo' can exist at a time")
@classmethod
def reset(cls):
cls.instance = None
cls.instance = Foo(...)
然后,您只需简单地引用
Foo.instance
即可访问实例。
我选择将
reset
设为类方法,并用
@classmethod
进行修饰。
使用此装饰器,可以通过调用
Foo.reset()
重置实例,并且
cls
参数会自动传递给该方法。
我更喜欢这种方法(更或多或少是单例模式),而不是您提出的那些方法,因为在您的情况下,似乎有一个
Foo
的单个实例是合理的,因为您想要进行重置。
因此,我认为强制使用单个实例相当直观。
另一方面,您可以在类外部拥有一个实例,并定义一个
reset
实例方法:
def reset(self):
self.__init__()
但这种方法可能效果不佳。比如说,如果你想在
__init__
方法之外设置属性,那么调用
__init__
将不会重置那些属性。因此,你的实例将不会按预期被重置。如果你持有一个单一的实例并将其重新分配给一个全新的实例,你可以确信它会是完全干净的。
关于你所谓的“创建一个新实例”,我选择的也大致是这样,但问题是要把它存储在哪里。我认为把它保存在类本身中是有意义的。
顺便说一下,这种解决方案不应该存在任何性能问题(如“内存泄漏”),因为每次只有一个
Foo
实例被引用,而创建一个新实例会取消引用以前的实例。
__new__
方法中处理)。只需创建一个新实例 - 如果没有对先前实例的其他引用,则它将自然丢弃。换句话说:正常的代码不会“手动”调用__init__
- 只需创建一个新实例并允许语言完成即可。 - jsbuenoself
,如果您有一个使用init更改的类变量,则会产生问题。假设该类跟踪已创建多少个对象,并且在__init __()
中将1
添加到num
,那么逻辑上重置不等于创建。 - Kaleba KB Keitshokile