在这个例子中,我为什么要使用__new__而不是__init__?

时间:2017-08-02 01:28:33

标签: python design-patterns

我最近一直在研究__new__,并且我已经阅读了许多使用__new__代替__init__的代码。有时我认为两者都有效,但我不知道原作者使用__new__的原因。

有人可以解释为什么以下代码使用__new__代替__init__?我想要这个例子的原因。我知道__new____init__之间的区别,但我不知道为什么__new__在这里使用。

Example

    class MiniSubtest(object):
        def __new__(cls, *args, **kargs):
            self = super(MiniSubtest, cls).__new__(cls)
            ret = None
            if args is None:
                args = []
            try:
                ret = self.test(*args, **kargs)
            finally:
                if hasattr(self, "clean"):
                    self.clean()
            return ret

并且我认为如果我使用__init__,它仍然有效,乳清使用__new__?

2 个答案:

答案 0 :(得分:0)

__new__用于控制新实例的创建,并希望您返回它,而__init__只允许您初始化已创建的实例

我的猜测是self.test根据参数

返回不同类型的实例

答案 1 :(得分:0)

这控制了新实例的创建和返回:

  • 首先创建实例。
  • try子句在测试新实例期间捕获异常。
  • 然后,如果有异常,它将清除实例的垃圾。
  • 然后它返回None而不是实例。

因此,它决定返回一个实例或将其丢弃。