Python: 对同一实例多次调用 __init__()

17 投票
4 回答
15900 浏览
提问于 2025-04-15 18:31

当我们创建一个对象时,__init__()这个函数会被自动调用。

那么,在对象已经创建之后,重新调用这个对象的__init__()函数可以吗?

instance = cls(p1=1, p2=2)
# some code
instance.__init__(p1=123, p2=234)
# some more code
instance.__init__(p1=23, p2=24)

为什么会有人想要在一个已经创建的对象上再次调用__init__()呢?

这是个好问题。我想要重新初始化这个对象的属性。

4 个回答

1

据我所知,这样做不会引起任何问题(补充说明:根据使用super(...).__init__(...)的规范来说),但我觉得如果有一个reset()方法,并且在__init__()里和需要重置的时候都调用它,会让代码看起来更整洁。

6

你是可以这么做的,但这有点违背了__init__的本意。很多Python的用法其实都是一些约定,所以你最好遵循这些约定,期待__init__只被调用一次。我建议你创建一个叫init或者reset的函数,用来设置实例变量,当你想重置实例的时候就用这个函数,然后让__init__去调用init。这样看起来会更合理一些:

x = Pt(1,2)
x.set(3,4)
x.set(5,10)
15

在一个对象上多次调用 __init__ 是没问题的,只要你写的 __init__ 能达到你想要的效果(无论那是什么)。一个常见的情况是,当你的类的 __new__ 方法返回一个类的实例时,这会导致 __init__ 在返回的实例上被调用(如果你通过 __new__ 不断“回收”实例,这可能是第二次,或者是第二十次调用!)。所以你最好把 __init__ 写得合适一些!-

你可以在这里找到一些额外的指导。 对象初始化期间对 init 的多次调用

撰写回答