상위 목록: 하위 목록: 작성 날짜: 읽는 데 21 분 소요

매직 메서드(Magic Method)

매직 메서드(Magic Method)는 미리 정의되어 있는 메서드들을 재정의하여 클래스를 활용할 수 있도록 변경합니다.

내장 함수들이 처리하는 연산을 변경해 사용자 정의 클래스나 함수 등을 효율적으로 사용할 수 있습니다.

Underscore(_)를 두 번 사용해 매직 메서드를 정의할 수 있습니다.

  • Tip : 매직 메서드는 이중 밑줄(Double Underscore)를 사용해 정의합니다.



산술 연산 정의

class Daeheeyun:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        return self.value + int(other)

    def __radd__(self, other):
        return self.value + other

    def __iadd__(self, other):
        return self.value + abs(other)


instance = Daeheeyun(5)
add = instance + 3.076923
radd = 3.076923 + instance
instance += -3.076923

print(add)
print(radd)
print(instance)
결과
8
8.076923
8.076923


정방향 연산자

정방향 연산자는 x + y에 대한 연산을 정의합니다.

인스턴스의 값이 x가 되며, 외부 값이 y가 됩니다.

예제는 yint로 변환 후, 연산합니다.


역방향 연산자

정방향 연산자는 y + x에 대한 연산을 정의합니다.

인스턴스의 값이 x가 되며, 외부 값이 y가 됩니다.

예제는 y를 변환 없이 연산합니다.


복합 대입 연산자

복합 대입 연산자는 x += y에 대한 연산을 정의합니다.

인스턴스의 값이 x가 되며, 외부 값이 y가 됩니다.

예제는 y를 절댓값으로 변환하고 연산합니다.


산술 연산자 의미 역방향 복합 대입
object.__add__(self, other) object + other 연산 정의 __radd__ __iadd__
object.__sub__(self, other) object - other 연산 정의 __rsub__ __isub__
object.__mul__(self, other) object * other 연산 정의 __rmul__ __imul__
object.__matmul__(self, other) object @ other 연산 정의 __rmatmul__ __imatmul__
object.__truediv__(self, other) object / other 연산 정의 __rtruediv__ __itruediv__
object.__floordiv__(self, other) object // other 연산 정의 __rfloordiv__ __ifloordiv__
object.__mod__(self, other) object % other 연산 정의 __rmod__ __imod__
object.__pow__(self, other[, modulo]) pow() 연산 정의 __rpow__ __ipow__
object.__divmod__(self, other) divmod() 연산 정의 __rdivmod__ __idivmod__
object.__round__(self) round() 연산 정의 없음 없음
object.__trunc__(self) math.trunc() 연산 정의 없음 없음
object.__floor__(self) math.floor() 연산 정의 없음 없음
object.__ceil__(self) math.ceil() 연산 정의 없음 없음



단항 연산 정의

class Daeheeyun:
    def __init__(self, value):
        self.value = value

    def __pos__(self):
        return self.value + 2

    def __neg__(self):
        return self.value - 2

    def __abs__(self):
        return -abs(self.value)

    def __invert__(self):
        return ~self.value


instance = Daeheeyun(5)
print(+instance)
print(-instance)
print(abs(instance))
print(~instance)
결과
7
3
-5
-6


__pos__ : Positive

+object 연산자는 +x에 대한 연산을 정의합니다.

예제는 x를 양수를 곱하지 않고, +2 연산으로 변경합니다.


__neg__ : Negative

-object 연산자는 -x에 대한 연산을 정의합니다.

예제는 x를 음수를 곱하지 않고, -2 연산으로 변경합니다.


__abs__ : Absolute

abs() 연산자는 abs(x)에 대한 연산을 정의합니다.

예제는 x를 절대값으로 취하지 않고, 음수로 변경합니다.


__invert__ : Invert

~object 연산자는 ~x에 대한 연산을 정의합니다.

예제는 ~x를 변환 없이 연산합니다.


단항 연산자 의미
object.__pos__(self) +object 연산 정의
object.__neg__(self) -object 연산 정의
object.__abs__(self) abs() 연산 정의
object.__invert__(self) ~object 연산 정의



비트 연산 정의

비트 연산자 중 not 연산자는 재정의할 수 없으며, __bool__ 연산자를 통해 변경할 수 있습니다.

또는 ~object 연산자를 재정의해 not 연산자로 활용할 수 있습니다.


비트 연산자 의미 역방향 복합 대입
object.__lshift__(self, other) object « other 연산 정의 __rlshift__ __ilshift__
object.__rshift__(self, other) object » other 연산 정의 __rrshift__ __irshift__
object.__and__(self, other) object & other 연산 정의 __rand__ __iand__
object.__or__(self, other) object | other 연산 정의 __ror__ __ior__
object.__xor__(self, other) object ^ other 연산 정의 __rxor__ __ixor__



비교 연산 정의

비교 연산자는 역방향 연산자복합 대입 연산자는 존재하지 않습니다.

정방향 연산자만 정의할 수 있으며, 역방향으로 연산할 경우, 정방향으로 간주됩니다.


비교 연산자 의미
object.__lt__(self, other) object < other 연산 정의
object.__le__(self, other) object <= other 연산 정의
object.__eq__(self, other) object == other 연산 정의
object.__ne__(self, other) object != other 연산 정의
object.__gt__(self, other) object > other 연산 정의
object.__ge__(self, other) object >= other 연산 정의



형식 변환 정의

class Daeheeyun:
    def __init__(self, value):
        self.value = value

    def __index__(self):
        return 2


L = ["A", "B", "C", "D", "E"]
instance = Daeheeyun(100)
print(L[instance])
결과
C

형식 변환은 인스턴스의 형식을 변환할 때 사용됩니다.

그 중, __index__는 slice 연산을 진행할 때 할당되는 index를 정의합니다.

예제의 index의 값을 2로 정의하여, 리스트에서 C가 출력됩니다.


형식 변환 의미
object.__int__(self) int() 연산 정의
object.__float__(self) float() 연산 정의
object.__complex__(self) complex() 연산 정의
object.__bool__(self) bool() 연산 정의
object.__hash__(self) hash() 연산 정의
object.__index__(self) slice 연산의 index 정의

댓글 남기기