python - 在 Python 中重置类的首选方法

标签 python python-3.x class

基于 this post on CodeReview .

我有课 Python (3) 中的 Foo,当然包含一个 __init__() 方法。这个类会触发几个提示并执行它的操作。假设我希望能够重置 Foo,这样我就可以重新开始整个过程​​。

首选的实现方式是什么?

再次调用__init__()方法

def reset(self):
    self.__init__()

还是创建一个新实例?

def reset(self):
    Foo()

如果多次调用 reset,我不确定创建 Foo 的新实例是否会留下任何可能影响性能的东西。另一方面,如果不是所有属性都在 __init__() 中(重新)定义,则 __init__() 可能会产生副作用。

有更好的方法吗?

最佳答案

两者都是正确的,但语义的实现方式不同。

为了能够重置一个实例,我会写这个(我更喜欢从 __init__ 调用自定义方法而不是相反,因为 __init__ 是一个特殊的方法,但这主要是品味问题):

class Foo:
    def __init__(self):
        self.reset()
    def reset(self):
        # set all members to their initial value

你这样使用它:

Foo foo      # create an instance
...
foo.reset()  # reset it

从头创建一个新实例实际上更简单,因为该类不必实现任何特殊方法:

Foo foo      # create an instance
...
foo = Foo()  # make foo be a brand new Foo

如果旧实例没有在其他任何地方使用,它将被垃圾回收

这两种方式都可以用于所有初始化都在 __init__ 中完成的普通类,但是第二种方式需要用于在创建时使用 __new__,例如不可变类。


但请注意,这段代码:

def reset(self):
    Foo()

不会做你想做的事:它只会创建一个新实例,并立即删除它,因为它会在方法结束时超出范围。甚至 self = Foo() 也只会设置本地引用,这同样会在方法结束时超出范围(并且新实例被销毁)。

关于python - 在 Python 中重置类的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45798899/

相关文章:

c++ - boost_python with python 3.5 from anaconda - (few) undefined references

C++双向链表 - 使用pop_back()从尾部删除元素

java - 如果只在对象初始化时分配内存,类成员变量(实例变量)如何初始化?

python - 处理或引发 Python 异常是否有效?

python - 如何获取带有换行符的用户输入

python - Python 和 C++ 之间的变量作用域有什么区别(如果存在)?

c# - 如何在 ASP.net 中的 IronPython 库上导入第 3 方 Python 库

python - 无法在 Python 中中止 (ctrl+c)

python - 在多处理池中使用时未正确引发自定义异常

java - 需要帮助将一个类实现到另一个代码块中并运行一个类 java