Python 중__new__및 __init__구별과 연계

2265 단어 Pythonnewinit

__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 <class '__main__.ClsTest'>init

3. __new__메서드는 구성된 객체를 반환합니다. __init__그렇지 않습니다. __init__반환 값이 없습니다.


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

initTraceback (most recent call last):  File "<stdin>", line 1, in <module>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__실례화할 클래스를 나타내는 매개 변수 cls가 하나 이상 있어야 합니다. 이 매개 변수는 실례화할 때 Python 해석기에서 자동으로 제공됩니다. _new__반환 값이 있어야 합니다. 실례화된 실례를 반환하려면 return 부모 클래스 _new__나온 인스턴스 또는 object의 __new__나온 실례
3. __init__매개 변수self가 있습니다. 바로 이__new__반환된 인스턴스, __init____new__를 기반으로 다른 초기화 작업을 수행할 수 있습니다.__init__값을 반환할 필요가 없습니다.
4. 만약__new__객체의 인스턴스를 반환하면 __ 이 암시적으로 호출됩니다.init__
Python에서 __ 에 대한 추가 정보new__및 __init__의 차이점 및 연락처 설명은 아래 링크를 참조하십시오.

좋은 웹페이지 즐겨찾기