[ 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 생성됨
[ 결과 ]
[ 다음 글 ]
[ 참고 ]
https://rszalski.github.io/magicmethods/
'컴퓨터 언어 > Python' 카테고리의 다른 글
[ Python 3 ] EasyDict 라이브러리 사용해보기! (2) | 2022.09.20 |
---|---|
[ Python 3 ] Magic Methods 다루기 - 2. 비교 연산자 ( __eq__, __ne__, __lt__, __gt__, __le__, __ge__ ) (0) | 2022.08.18 |
[ Python 3 ] super(클래스, self).__init__() 에 대해 제대로 알아보자!! (0) | 2022.08.15 |
[ Python 3 ] 클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치) (3) | 2022.08.15 |
[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자! (0) | 2022.08.15 |