생성(__new__) 및 초기화(__init__)
이전 글의 내용을 통해 우리는 클래스를 정의할 때 객체를 인스턴스화할 때 속성을 설정하기 위해 __init__(self) 메서드를 사용하는 경우가 많다는 것을 이미 알고 있습니다. 예를 들면 다음과 같습니다.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User(object): def __init__(self, name, age): self.name = name; self.age = age; user=User('两点水',23)
사실 클래스를 생성하는 과정은 두 단계로 나누어집니다. 하나는 클래스의 객체를 생성하는 것이고, 다른 하나는 클래스를 초기화하는 것입니다. __new__는 클래스를 생성하고 이 클래스의 인스턴스를 반환하는 데 사용되는 반면, __init__는 전달된 매개 변수로 인스턴스를 초기화할 뿐입니다. __new__는 인스턴스를 생성하는 과정에서 반드시 호출되지만 __init__은 다음과 같이 반드시 호출되지는 않습니다. pickle .load를 사용하여 인스턴스를 역직렬화할 때 __init__ 메서드는 호출되지 않습니다.
def __new__(cls)는 def __init__(self) 메서드보다 먼저 호출되며 해당 기능은 인스턴스 개체를 반환하는 것입니다. 또 한 가지 주목해야 할 점은 __new__ 메소드는 항상 클래스의 인스턴스를 반환해야 하며 __init__는 None을 제외한 어떤 값도 반환할 수 없다는 것입니다. , 클래스 생성 과정이 어떤 것인지 알 수 있습니다. 먼저 __new__ 메서드를 호출하여 객체를 생성하고 매개변수를 __init__ 메서드에 전달하여 인스턴스화합니다.
실제로 실제 개발에서는 클래스 생성을 제어하려는 경우가 아니면 __new__ 메서드는 거의 사용되지 않습니다. 일반적으로 __new__에 대해 이야기할 때는 모두 메타클래스와 관련됩니다.
물론 객체의 수명 주기가 끝나면 소멸자 __del__ 메서드가 호출됩니다. 하지만 이 방법은 Python 자체에서 개체를 가비지 수집하는 데 사용됩니다.