2017-08-02 74 views
0

最近我一直在研究__new__,我读过很多代码,其中__new__代替__init__。有时我认为两者都有效,但我不知道为什么原作者使用__new__为什么我应该在这个例子中使用__new__而不是__init__?

有人可以解释为什么下面的代码使用__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__?

+1

[Python使用\ _ \ _ new \ _ \ _和\ _ \ _ init \ _ \ _?]的可能重复(https://stackoverflow.com/questions/674304/pythons-use-of -new-and-init) –

+0

'__init__'和'__new__'不是一样的。 '__new__'是实际创建类的实例的方法。它返回一个新的类实例。一旦'__new__'创建实例,它就会通过通常名为'self'的第一个参数传递给'__init__'。 '__init__'是允许您通过初始化属性来定制实例的方法。 –

+0

Yuck。不要在这里上课;使用工厂函数 – ppperry

回答

0

__new__用来控制一个新的实例的创建,并希望你回吧,而__init__只让你初始化已创建一个实例

我的猜测是,self.test返回根据不同类型的实例在参数

+0

嗨,为什么它需要在使用__new__时返回不同类型的实例,并且,如果您访问https://github.com/autotest/tp-qemu/blob,我不会看到它返回不同类型的实例/master/qemu/tests/cpuflags.py#L484 – user1334609

+0

,因为我认为_ \ _ init__可以在这里使用,如果有人向我解释为什么它使用_ \ _ new__,我会关闭这个问题,我不认为它是一个重复的问题,我在这里给出了一个具体的例子,我希望答案也是具体的。 – user1334609

相关问题