[Python] 파이썬 매직 메서드
- -
파이썬 매직 메서드
오늘은 파이썬에 있는 매직 메서드라는 것에 대해 알아보는 시간을 가져보자, 매직 메서드는 파이썬에서 더블 언더스코어 "__"로 시작하고 끝나는 특별한 이름의 메서드이다. 이러한 매직 메서드는 클래스 내에서 특정한 동작을 정의하거나 커스터마이징 하는 데 사용된다. 여러 가지 매직 메서드가 있지만 주요한 메서드의 간단한 설명과 예시 코드를 한 번 살펴보자.
1. __init__(self,...)
__init__() 메서드는 파이썬 클래스에서 특별한 메서드로, 객체가 생성될 때 자동으로 호출되는 생성자(constructor) 역할을 한다. __init__() 메서드를 정의하면 객체의 초기화 과정을 수행할 수 있으며, 이를 통해 객체의 속성(attribute)을 초기화하고 다른 초기 설정 작업을 수행할 수 있다.
class MyClass:
def __init__(self, param1, param2, ...):
# 객체 초기화 코드
self.attribute1 = param1
self.attribute2 = param2
# ...
- self는 클래스의 인스턴스를 나타내는 특별한 변수로, 파이썬에서는 관례적으로 사용된다. self를 통해 클래스의 속성에 접근하고 속성을 초기화할 수 있다.
- param1, param2...은 객체를 생성할 때 전달되는 매개변수를 받을 수 있다. 이러한 매개변수를 통해 객체의 속성을 초기화하거나 다른 초기화 작업을 수행할 수 있다.
__init__() 메서드를 사용하여 객체를 초기화하면, 객체를 생성할 때 매개변수를 전달하여 원하는 속성 값을 설정할 수 있다.
my_object = MyClass(param1_value, param2_value)
위에서 param1_value의 param2_value는 __init__() 메서드 내에서 self.attribute1 및 self.attribute2로 초기화된다. 이를 통해 객체를 생성하고 속성을 초기화하는 방식을 사용자 지정 클래스에서 많이 활용한다.
2. __str__(self,...), __repr__(self,...)
__str__() 및 __repr__() 메서드는 파이썬 클래스에서 사용자 정의 객체의 문자열 표현을 제어하는 특별한 메서드이다. 이러한 메서드를 정의하면 객체를 문자열로 표현할 때 사용자 정의된 방식으로 출력할 수 있다.
__str__()
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyClass instance with value: {self.value}"
obj = MyClass(29)
print(obj) # 출력: "MyClass instance with value: 29"
__str__() 메서드는 객체를 문자열로 표현할 때 사용된다. 주로 사용자 친화적인 형태의 문자열을 반환하고. str() 함수나 print() 함수에 객체를 전달할 떄 호출된다.
__repr__()
class MyClass:
def __init__(self, value):
self.value = value
def __repr__(self):
return f"MyClass({self.value})"
obj = MyClass(29)
print(obj) # 출력: "MyClass(29)"
__repr__() 메서드는 객체를 공식적으로 나타내는 문자열을 반환한다. 주로 디버깅 및 객체의 복원(재생성)에 사용되고 repr() 함수나 객체를 보여주는 상호작용 콘솔에서 호출된다.
3. __len__(self,...)
__len__() 메서드는 파이썬 클래스에서 사용자 정의 객체의 길이(크기)를 반환하는 메서드이다. 이 메서드를 정의하면 내장 함수 len()을 사용하여 객체의 길이를 확인할 수 있다. 따라서 객체의 길이를 나타내는 정수를 반환해야 한다. 그리고 len() 함수를 호출할 때, 파이썬은 이 메서드를 자동으로 호출하고 반환값을 반환한다. 일반적으로 이 메서드는 사용자 정의 컨테이너 클래스나 시퀀스 객체에서 사용된다.
class MyList:
def __init__(self):
self.items = []
def append(self, item):
self.items.append(item)
def __len__(self):
return len(self.items)
my_list = MyList()
my_list.append(1)
my_list.append(2)
my_list.append(3)
length = len(my_list)
print(f"길이: {length}") # 출력: "길이: 3"
위의 예제에서 MyList 클래스는 사용자 정의 리스트를 나타내며, __len__() 메서드를 정의하여 리스트의 길이를 반환한다. 이렇게 하면 len(my_list)를 호출할 때 __len__() 메서드가 자동으로 호출되어 리스트의 길이를 반환한다.
4._getitem__(self, key), __setitem__(self, key, value)
__getitem__() 및 __setitem__() 메서드는 파이썬 클래스에서 사용자 정의 시퀀스 객체를 만들 때 사용되는 특수한 메서드로, 시퀀스 객체(예 : 리스트, 튜플)처럼 객체의 요소를 가져오거나 설정할 때 사용된다.
__get__()
class MyList:
def __init__(self):
self.items = []
def append(self, item):
self.items.append(item)
def __getitem__(self, index):
return self.items[index]
my_list = MyList()
my_list.append(1)
my_list.append(2)
my_list.append(3)
value = my_list[1] # __getitem__() 메서드 호출
print(value) # 출력: 2
위에서 설명했다시피 __getitem__(self, key) 메서드는 객체의 요소를 가져올 때 호출된다. key 매개변수는 요소를 가져오기 위한 인덱스 또는 키를 나타낸다. 특정 인덱스나 키에 해당하는 값을 반환한다.
__setitem__()
class MyList:
def __init__(self):
self.items = []
def append(self, item):
self.items.append(item)
def __getitem__(self, index):
return self.items[index]
def __setitem__(self, index, value):
self.items[index] = value
my_list = MyList()
my_list.append(1)
my_list.append(2)
my_list.append(3)
my_list[1] = 29 # __setitem__() 메서드 호출
print(my_list[1]) # 출력: 29
__setitem__(self, key, value) 메서드는 객체의 요소를 설정(변경)할 때 호출된다. key 매개변수는 __getitem__() 예제에서 설명했던거와 마찬가지로 요소를 설정하기 위한 인덱스 또는 키를 나타내고 value 매개변수는 설정할 값이다.
__getitem__() 및 __setitem__() 메서드를 정의하면 사용자 정의 시퀀스 객체에서 요소를 가져오거나 설정할 때 내부 동작을 커스터마이즈할 수 있다. 이 메서드들을 사용하면 객체가 시퀀스처럼 동작하도록 만들 수 있으며, 사용자 정의 컨테이너 클래스에서 자체적으로 요소를 관리하거나 다른 동작을 수행할 수 있다.
5.__del__(self)
__del__() 메서드는 객체가 메모리에서 소멸될 때 호출되는 특별한 메서드이다. __del__() 메서드는 객체의 소멸(construction)과 관련된 동작을 정의할 때 사용된다. 이 메서드를 사용하여 객체가 소멸될 때 어떤 동작을 수행하고 메모리 자원을 해제할 수 있다.
또한, __del__() 메서드는 객체가 소멸될 때 자동으로 호출된다. 객체가 더 이상 참조되지 않거나 가비지 컬렉터에 의해 수거될 때 호출된다. 명시적으로 __del__() 메서드를 호출하는 것은 권장되지 않으며, 파이썬 인터프리터가 관리한다.
class MyClass:
def __init__(self, name):
self.name = name
print(f"{self.name} 객체가 생성되었습니다.")
def __del__(self):
print(f"{self.name} 객체가 소멸되었습니다.")
# 객체 생성
obj1 = MyClass("객체1")
obj2 = MyClass("객체2")
# 객체 소멸
del obj1 # obj1 객체가 소멸될 때 __del__() 메서드 호출
__del__() 메서드는 객체가 소멸할 때 출력문을 통해 언제 호출되는지 확인할 수 있다. 객체가 del 예약어를 사용하여 삭제되거나 더 이상 참조되지 않을 때 파이썬 인터프리터가 __del__() 메서드를 호출한다. 하지만 __del__() 메서드를 사용할 때 주의해야할 점이 있다. 객체가 소멸될 때 호출되므로 메모리 관리나 자원 해제와 관련된 작업을 수행하는 경우에만 사용해야 한다.
6. __call__(self,...)
__call__() 메서드는 파이썬 클래스의 특별한 메서드중 하나로, 객체를 함수처럼 호출할 수 있게 한다. 즉, 객체가 호출 가능하게 만들고 객체에 함수처럼 인자(argument)를 전달할 수 있게 한다. 이 메서드를 정의하면 해당 객체를 호출할 때 __call__() 메서드가 자동으로 호출된다.
class CallableClass:
def __init__(self):
self.value = 0
def __call__(self, x):
self.value += x
return self.value
# 객체 생성
obj = CallableClass()
# 객체를 함수처럼 호출
result1 = obj(10) # obj.__call__(10)를 호출
result2 = obj(20) # obj.__call__(20)를 호출
print(result1) # 출력: 10
print(result2) # 출력: 30
CallableClass 클래스는 __call__()_ 메서드를 정의하여 객체가 호출 가능하게 만들었다. 객체 obj를 함수처럼 호출할 수 있으며, 호출할 때마다 인자로 전달된 값(x)을 객체의 value에 누적하여 반환한다.
__call__() 메서드를 사용하면 객체에 상태를 유지하거나 객체에 대한 다양한 동작을 정의하는 데 활용할 수 있으며, 함수와 유사한 동작을 가지게 된다.
7. __add__(self, other), __sub__(self, other)
__add__() 및 __sub__() 메서드는 파이썬에서 연산자 오버로딩(Operator Overloading)을 지원하는 메서드로, 사용자 정의 클래스에서 객체 간의 덧셈 및 뺄셈 연산을 정의할 때 사용된다. 이 메서드들을 정의하면 해당 클래스의 객체끼리 + 및 - 연산자를 사용하요 사용자 정의된 동작을 수행할 수 있다.
__add__()
class MyNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
result = self.value + other.value
return MyNumber(result)
num1 = MyNumber(28)
num2 = MyNumber(1)
result = num1 + num2 # num1.__add__(num2)를 호출
print(result.value) # 출력: 29
위의 예제에서 확인할 수 있듯이 __add__() 메서드는 + 연산자를 사용할 때 호출되며 이 메서드는 덧셈 연산을 정의하고, 두 객체를 더한 결과를 반환한다.
__sub__()
class MyNumber:
def __init__(self, value):
self.value = value
def __sub__(self, other):
result = self.value - other.value
return MyNumber(result)
num1 = MyNumber(10)
num2 = MyNumber(3)
result = num1 - num2 # num1.__sub__(num2)를 호출
print(result.value) # 출력: 7
또한 위의 예제에서 확인할 수 있듯이 __sub__() 메서드는 - 연산자를 사용할 때 호출된다. 이 메서드는 뺄셈 연산을 정의하고, 두 객체를 뺀 결과를 반환한다.
8. __eq__(self, other), __ne__(self, other)
__eq__() 메서드와 __ne__() 메서드는 파이썬 클래스에서 객체 간의 동등성(equality) 비교를 정의하는 데 사용되는 특별한 메서드이다. 이러한 메서드를 정의하여 객체가 다른 객체와 동등한지(== 연산자) 또는 다르거나 부등한지(!= 연산자) 비교할 수 있다.
__eq__()
class MyClass:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj1 = MyClass(5)
obj2 = MyClass(5)
result = obj1 == obj2 # obj1.__eq__(obj2)를 호출
print(result) # 출력: True
위의 예제에서 보듯이 __eq__() 메서드는 == 연산자를 사용하여 두 객체가 동등한지 비교할 때 호출된다. 이 메서드는 두 객체가 동등한 경우 True를 반환하고, 그렇지 않은 경우 False를 반환한다.
__ne__()
class MyClass:
def __init__(self, value):
self.value = value
def __ne__(self, other):
if isinstance(other, MyClass):
return self.value != other.value
return True
obj1 = MyClass(5)
obj2 = MyClass(10)
result = obj1 != obj2 # obj1.__ne__(obj2)를 호출
print(result) # 출력: True
__ne__() 메서드는 != 연산자를 사용하여 두 객체가 부등한지 비교한다. __eq__()와는 반대로 두 객체가 부등한 경우 True를 반환하고, 그렇지 않은 경우 False를 반환한다.
__eq__() 및 __ne__() 메서드를 사용하면 사용자 정의 클래스에서 객체 간의 동등성 비교를 정의할 수 있다. 이를 통해 객체가 다른 객체와 비교되었을 때 필요한 조건에 따라 동작을 정의할 수 있으며, 객체의 내부 상태에 따라 비교 로직을 다양하게 조정할 수 있다.
읽어주셔서 감사합니다.
'Programming Language > Python' 카테고리의 다른 글
[Python] 반복문 for와 while문 (0) | 2023.08.31 |
---|---|
[Python] class의 개념과 사용법 (0) | 2023.08.30 |
[Python] Iterable의 개념과 iterator (0) | 2023.08.28 |
[Python] list에 값을 추가할 수 있는 insert 메서드 (0) | 2023.08.27 |
[Python] list에 값을 추가하는 메서드인 append와 extend의 차이 (0) | 2023.08.26 |
소중한 공감 감사합니다