새소식

반응형
Programming Language/Python

[Python] 파이썬 매직 메서드

  • -
반응형

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

 

 

 

읽어주셔서 감사합니다.

728x90
반응형
Contents

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

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