본문 바로가기

프로그래밍언어/Python

[Python] Magic method - 객체 생성, 초기화

반응형

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