본문 바로가기
컴퓨터 언어/Python

[ Python 3 ] Magic Methods 다루기 - 1. 생성, 초기화 ( __new__, __init__, __del__ )

by SuperMemi 2022. 8. 17.
반응형

[ Python 3 ] Magic Methods 다루기 - 1. 생성, 초기화( __new__, __init__, __del__)

 


[ 매직 메소드(Magic Methods)? ]

 

다들 알고 계시겠지만 파이썬은 객체 지향 언어입니다.

 

모든 데이터들은 객체로 표현되거나 객체 사이의 관계로 표현됩니다. 사전에 구현되어 내장된 많은 메소드들을 그대로 사용하거나 또는, 재정의하여 원하는 연산을 처리할 수 있습니다.

 

이들을 매직 메소드(Magic Methods) 또는 특별 메소드(Special Methods)라고도 부릅니다. 또한 이들은 특별하게 두 개의 언더바(__)가 메소드의 앞뒤로 붙어있는 형태를 가지고 있는데, 이러한 특징때문에 던더 메소드(Dunder methods)라고도 불립니다. 

 

백날 설명을 듣는 것 보다 눈으로 직접 한번 보시는게 좋습니다.


생성(Construction)과 초기화(Initialization) 관련 매직 메소드 

 

생성(Construction)과 초기화(Initialization), 그리고 파괴(Destructor)에 관련된 매직 메소드는 아래와 같이 3가지 종류가 있습니다.

 

  • __new__(cls, ...)
  • __init__(self, ...)
  • __del__(self)

 

하나씩 알아 봅시다.


__new__(cls, ...) 

 

새로운 인스턴스 형성시 가장 처음으로 실행되는 메소드입니다. class를 입력으로 받고, 입력받은 나머지 인자들은 그대로 __init__ 으로 넘겨 줍니다. 어떤 인스턴스를 생성함에 앞서 어떠한 조건을 설정할 수 있습니다. __new__ 메소드는 어떠한 객체(object)를 반환해야 합니다. 

 

[ 예시 ]

Person_name 이라는 클래스를 만들었습니다.

 

[ 조건 ]

사람의 이름은 문자열로만 받고 싶습니다.

이름이 문자열이 아니라면 객체를 형성하지 않고 문자열로 달라는 메시지를 출력합니다.

이름이 문자열이라면 객체를 형성합니다. 그리고 나머지 인자는 __init__으로 전달합니다. 

 

[ 코드 ]

class Person_name(object):
    def __new__(cls, name):
        if isinstance(name,str):
            return super(Person_name, cls).__new__(cls)
        else:
            print("사람의 이름은 문자열로 해주세요")
            return None
    
    def __init__(self, name):
        self.name = name
        
p1 = Person_name(90) # 문자열이 아닌경우
print(p1)
p1 = Person_name('james') # 문자열일 경우
print(p1.name)

[ 결과 ]

 


__init__(self, ...) 

 

__init__은 생성자가 아니라 내부 인스턴스 속성을 초기화하는 역할을 가지고 있습니다.

__init__ 은 앞선 글에서 많이 설명했기 때문에 여기서는 생략하겠습니다.

 

클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)

클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)

super(클래스, self).__init__() 에 대해 제대로 알아보자!!


__del__(self, ...) 

 

__del__ 의 경우엔 파괴자(destructor)역할을 담당합니다. 어떤 객체가 소멸할때 해야할 일을 지정할 수 있습니다. 그러나 경우에 따라 작동하지 않을 수도 있으므로 사용시 주의를 기우려야 합니다.

 

 

[ 예시 ]

FileObject 이라는 클래스를 만들었습니다.

 

[ 조건 ]

어떤 파일객체를 생성함과 동시에 파일을 생성합니다.

객체가 사라질때 반드시 파일이 닫혀지도록 설정합니다.

 

[ 코드 ]

# From : https://rszalski.github.io/magicmethods/

from os.path import join

class FileObject:
    '''Wrapper for file objects to make sure the file gets closed on deletion.'''

    def __init__(self, filepath='./', filename='sample.txt'):
        # open a file filename in filepath in write mode
        self.file = open(join(filepath, filename), 'w')

    def __del__(self):
        self.file.close()
        del self.file
        
f = FileObject() # sample.txt 생성됨

[ 결과 ]

 


[ 다음 글 ]

2022.08.18 - [컴퓨터 언어/Python] - [ Python 3 ] Magic Methods 다루기 - 2편 비교 연산자 ( __eq__, __ne__, __lt__, __gt__, __le__, __ge__ )

 

[ Python 3 ] Magic Methods 다루기 - 2편 비교 연산자 ( __eq__, __ne__, __lt__, __gt__, __le__, __ge__ )

[ Python 3 ] Magic Methods 다루기 - 2편 비교 연산자 [ 이전 글 ] 2022.08.17 - [컴퓨터 언어/Python] - [ Python 3 ] Magic Methods 다루기 - 1편 생성, 초기화 ( __new__, __init__, __del__ ) [ P..

supermemi.tistory.com


[ 참고 ]

https://rszalski.github.io/magicmethods/


 

반응형