Python中_new__および_init__の区別と連絡

2124 ワード

__new__ および_init__ の違いは主に以下の通りです.
__new__ オブジェクトの作成を担当して_init__ オブジェクトの初期化を担当します.
__new__:オブジェクトの作成時に呼び出され、現在のオブジェクトのインスタンスが返されます.
__init__:オブジェクトの作成後に呼び出され、現在のオブジェクトのインスタンスの一部が初期化され、戻り値がありません.
1.クラスで__の場合new__および_init__同時に存在し、優先的に__が呼び出されます.new__

class ClsTest(object):    def __init__(self):        print("init")    def __new__(cls,*args, **kwargs):        print("new")ClsTest()

出力:

new

2.もし_new__オブジェクトのインスタンスを返します.暗黙的に呼び出されます.init__
コードの例:

class ClsTest(object):    def __init__(self):        print ("init")    def __new__(cls,*args, **kwargs):        print ("new %s"%cls)        return object.__new__(cls, *args, **kwargs)ClsTest()

出力:

new init

3. __new__メソッドは、構築されたオブジェクトを返します.init__できません.init__戻り値がありません.

class ClsTest(object):     def __init__(cls):             cls.x = 2             print ("init")             return clsClsTest()

出力:

initTraceback (most recent call last):  File "", line 1, in TypeError: __init__() should return None, not 'ClsTest'

4.若_new__現在のクラスclsのインスタンスが正しく返されていません.init__呼び出されません.親のインスタンスでもできません.

class ClsTest1(object):    passclass ClsTest2(ClsTest1):    def __init__(self):        print ("init")    def __new__(cls,*args, **kwargs):        print ("new %s"%cls)        return object.__new__(ClsTest1, *args, **kwargs)b=ClsTest2()print (type(b))

出力:
new
知識点:
1.objectから継承された新しいクラスがあります_new__
2. __new__インスタンス化するクラスを表す少なくとも1つのパラメータclsが必要です.このパラメータは、インスタンス化時にPython解釈器によって自動的に提供されます.new__インスタンス化されたインスタンスを返すには、戻り値が必要です.return親クラス_new__出てきた例、または直接objectの_new__出てきた実例
3. __init__パラメータselfがあります.これです.new__返されるインスタンス、_init__で_new__の基礎の上でいくつかのその他の初期化の動作を完成することができて、_init__戻り値は不要
4.もし_new__オブジェクトのインスタンスを返します.暗黙的に呼び出されます.init__
Pythonについてnew__および_init__の違いと連絡先の紹介は以下の関連リンクを参照してください