2017-08-02 7 views
0

最近私は__new__を勉強しており、__init__の代わりに__new__が使用されています。時には私はどちらもうまくいくと思いますが、元の作者がなぜ__new__を使用しているのか分かりません。この例では__init__の代わりに__new__を使用するのはなぜですか?

__init__の代わりに__new__を使用する理由を説明できる人はいますか?私はこの例の理由が必要です。私は__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

ヤック。ここでクラスを使用しないでください。ファクトリ関数を使用する – 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

関連する問題