새소식

반응형
Programming Language/Python

[Python] 파이썬 매직 메서드

  • -
반응형

파이썬 로고 이미지입니다.
Python


오늘은 파이썬에 있는 매직 메서드라는 것에 대해 알아보는 시간을 가져보자, 매직 메서드는 파이썬에서 더블 언더스코어 "__"로 시작하고 끝나는 특별한 이름의 메서드이다. 이러한 매직 메서드는 클래스 내에서 특정한 동작을 정의하거나 커스터마이징 하는 데 사용된다. 여러 가지 매직 메서드가 있지만 주요한 메서드의 간단한 설명과 예시 코드를 한 번 살펴보자.

 

__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로 초기화된다. 이를 통해 객체를 생성하고 속성을 초기화하는 방식을 사용자 지정 클래스에서 많이 활용한다.

 

__str__() 및 __repr__() 메서드는 파이썬 클래스에서 사용자 정의 객체의 문자열 표현을 제어하는 특별한 메서드이다. 이러한 메서드를 정의하면 객체를 문자열로 표현할 때 사용자 정의된 방식으로 출력할 수 있다. 

 

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() 함수에 객체를 전달할 떄 호출된다.

 

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() 함수나 객체를 보여주는 상호작용 콘솔에서 호출된다.

 

__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__() 메서드가 자동으로 호출되어 리스트의 길이를 반환한다.

 

__getitem__() 및 __setitem__() 메서드는 파이썬 클래스에서 사용자 정의 시퀀스 객체를 만들 때 사용되는 특수한 메서드로, 시퀀스 객체(예 : 리스트, 튜플)처럼 객체의 요소를 가져오거나 설정할 때 사용된다.

 

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 매개변수는 요소를 가져오기 위한 인덱스 또는 키를 나타낸다. 특정 인덱스나 키에 해당하는 값을 반환한다.

 

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__() 메서드를 정의하면 사용자 정의 시퀀스 객체에서 요소를 가져오거나 설정할 때 내부 동작을 커스터마이즈할 수 있다. 이 메서드들을 사용하면 객체가 시퀀스처럼 동작하도록 만들 수 있으며, 사용자 정의 컨테이너 클래스에서 자체적으로 요소를 관리하거나 다른 동작을 수행할 수 있다.

 

__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__() 메서드를 사용할 때 주의해야할 점이 있다. 객체가 소멸될 때 호출되므로 메모리 관리나 자원 해제와 관련된 작업을 수행하는 경우에만 사용해야 한다.

 

__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__() 메서드를 사용하면 객체에 상태를 유지하거나 객체에 대한 다양한 동작을 정의하는 데 활용할 수 있으며, 함수와 유사한 동작을 가지게 된다.

 

 

__add__() 및 __sub__() 메서드는 파이썬에서 연산자 오버로딩(Operator Overloading)을 지원하는 메서드로, 사용자 정의 클래스에서 객체 간의 덧셈 및 뺄셈 연산을 정의할 때 사용된다. 이 메서드들을 정의하면 해당 클래스의 객체끼리 + 및 - 연산자를 사용하요 사용자 정의된 동작을 수행할 수 있다.

 

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__() 메서드는 + 연산자를 사용할 때 호출되며 이 메서드는 덧셈 연산을 정의하고, 두 객체를 더한 결과를 반환한다.

 

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__() 메서드는 - 연산자를 사용할 때 호출된다. 이 메서드는 뺄셈 연산을 정의하고, 두 객체를 뺀 결과를 반환한다.

 

 

__eq__() 메서드와 __ne__() 메서드는 파이썬 클래스에서 객체 간의 동등성(equality) 비교를 정의하는 데 사용되는 특별한 메서드이다. 이러한 메서드를 정의하여 객체가 다른 객체와 동등한지(== 연산자) 또는 다르거나 부등한지(!= 연산자) 비교할 수 있다.

 

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를 반환한다.

 

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__() 메서드를 사용하면 사용자 정의 클래스에서 객체 간의 동등성 비교를 정의할 수 있다. 이를 통해 객체가 다른 객체와 비교되었을 때 필요한 조건에 따라 동작을 정의할 수 있으며, 객체의 내부 상태에 따라 비교 로직을 다양하게 조정할 수 있다.

 

 

 

읽어주셔서 감사합니다.

728x90
반응형

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.