2017-08-02 99 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

相關問題