Pythonの中の_new__方法

1376 ワード


__new__Pythonはオブジェクト向け言語ではあまり使われていない関数で、initという関数が多く使われています.
公式文書によると:
  • __init__インスタンスオブジェクトの作成が完了すると呼び出され、オブジェクトプロパティの初期値が設定されます.
  • __new__インスタンスの作成前に呼び出されます.これは、インスタンスを作成してインスタンスに戻るタスクであるため、静的メソッドです.

  • つまり、_new__で_init__前に呼び出されて、_new__の戻り値(インスタンス)が__に渡されます.init__メソッドの最初のパラメータ、そして_init__このインスタンスにパラメータを設定します.
    class Book(object):
        def __new__(cls, title):
            print '__new__'
            return super(Book, cls).__new__(cls)
    
        def __init__(self, title):
            print '__init__'
            super(Book, self).__init__(self)
            self.title = title
    
    b = Book('The Django Book')
    print(b.title)
  •  

  • 上記の結果:
    __new__
    __init__
    The Django Book

     
    で_new__一例を実現するために
    実際、私たちが理解するとnew__方法の後、設計モードの単一のモード(singleton)を実現するなど、他の面白いことをするためにも利用できます.クラスがインスタンス化されるたびに生成されるプロセスは__を通過するためです.new__制御するので、リロード_new__方法は,単一例モードを簡単に実現できる.
     
    1 2 3 4 5 6 7 8 9 10 11 12 13
    class Singleton(object):     def __new__(cls):重要なのは、インスタンス化するたびに、同じinstanceオブジェクトif not hasattr(cls,'instance'):clsだけを返すことです.instance = super(Singleton, cls).__new__(cls)         return cls.instance   obj1 = Singleton() obj2 = Singleton()   obj1.attr1 = 'value1' print obj1.attr1, obj2.attr1 print obj1 is obj2
    出力結果:
     
    1 2
    value1 value1 True