1. object.__new__(cls [, ...])
__new__() 는 클래스 cls 의 새 인스턴스를 만들기 위해 호출된다. __new__()는 static method 로 첫번째 인자로는 만들려고 하는 인스턴스의 클래스가 전달된다. 나머지 인자들은 객체 생성자에 전달되는 것들이다.
일반적으로 super().__new__(cls [, ...]) 에 적절한 인자들을 전달하는 방법으로 super class 의 __new__() 를 호출해서 새 인스턴스를 만든 후, 해당 인스턴스를 반환하기 전에 수정을 진행한다.
__new__() 가 객체 생성 시에 호출되고 cls 클래스의 인스턴스를 반환한다면 __init__(self [, ...]) 를 호출하는데, 이때 self 에는 새로 생성된 인스턴스가 전달되며 나머지 인자에도 생성자로 전달된 인자들이 동일하게 전달된다.
만약 __new__() 메서드가 cls 인스턴스를 반환하지 않으면, 새 인스턴스의 __init__() 는 호출되지 않는다.
2. object.__init__(self [, ...])
__new__() 에 의해 인스턴스가 만들어진 후 해당 인스턴스가 반환되기 전에 호출된다. 인자들은 클래스 생성자를 통해 전달된 것들이 사용된다. 만약 base class 가 __init__() 메서드를 가지고 있다면, 해당 클래스에서 파생된 클래스들의 __init__() 메서드는 super().__init__(...) 을 통해 base class 의 초기화를 수행해야 한다.
3. object.__del__(self)
인스턴스가 소멸될 때 호출되는 소멸자이다. __init__() 과 동일하게 base class 가 소멸자를 가지고 있으면 자손 클래스의 소멸자에서 base class 의 소멸자를 호출해 주어야 한다. del 키워드를 호출한다고 해서 바로 __del__ 메서드가 호출되지는 않는다. 해당 객체의 reference count 가 0 이 되어야 객체가 소면되면서 해당 메서드가 호출된다.
Interpreter 종료 시에 남아있는 객체들에 대해서 반드시 __del__() 메서드가 호출된다는 보장은 없다.
class TestClass:
def __new__(cls, *args, **kwargs):
if len(args) < 1:
return None
return super().__new__(cls, *args, **kwargs)
def __init__(self):
print("obj is initialized")
self.value = 0
def __del__(self):
print("obj is destroyed")
'프로그래밍언어 > Python' 카테고리의 다른 글
[Python] Magic method - 속성 관리 (0) | 2021.12.16 |
---|---|
[Python] Magic method - 객체 표현 (0) | 2021.12.15 |
[Python] urlparse (0) | 2021.10.16 |
[Python] argparser (0) | 2021.09.11 |
[Python] Python 병렬처리 - threading (3) (0) | 2021.05.08 |