[python] 매직 메서드

728x90

1. 매직메서드의 정의

매직 메서드는 파이썬에서 특별한 기능을 제공하는 메서드입니다. 다른 메서드와 달리 **더블 언더스코어(__)**로 시작하고 끝나며, 클래스 내부적으로 구현되어 있습니다.

 

예제)

n = 10

print(type(n)) #출력:<class 'int'> -> n은 변수이지만, 클래스 int형이란 뜻 따라서 매직메서드를 호출 가능

print(dir(n))
# 출력:
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewa
# rgs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd
# __', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__r
# xor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_b

print(n.__doc__) # 클래스 int에 대한 설명
#출력:
# int([x]) -> integer
# int(x, base=10) -> integer
#
# Convert a number or string to an integer, or return 0 if no arguments
# are given.  If x is a number, return x.__int__().  For floating point
# numbers, this truncates towards zero.
#
# If x is not a number or if base is given, then x must be a string,
# bytes, or bytearray instance representing an integer literal in the
# given base.  The literal can be preceded by '+' or '-' and be surrounded
# by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.
# Base 0 means to interpret the base from the string as an integer literal.
# >>> int('0b100', base=0)
# 4

print(n.__add__(100), n+100) # 출력:110 110

print(n.__bool__(),bool(n)) #출력: True True

print(n.__mul__(100),n*100) # 출력: 1000 1000

print(n.__pow__(2), n**2) # 출력: 100 100

2. __init__ 메서드

파이썬에서 __init__ 메서드는 클래스를 정의할 때 초기화 작업을 수행하는 특별한 메서드입니다. __init__은 "이니셜라이제이션"을 의미하며, 클래스의 객체가 생성될 때 자동으로 호출되는 메서드입니다.

__init__ 메서드를 사용하면 객체가 생성될 때 초기화 작업을 수행하여 해당 클래스의 속성을 설정할 수 있습니다. 이를 통해 객체가 생성될 때 필요한 초기 상태를 설정하거나 다른 초기화 작업을 수행할 수 있습니다.

__init__ 메서드는 다음과 같은 형식으로 정의합니다

class 클래스명:
    def __init__(self, 인자1, 인자2, ...):
        # 초기화 작업을 수행하는 코드
        self.속성1 = 인자1
        self.속성2 = 인자2
        # ...

__init__ 메서드의 첫 번째 인자로 self를 사용하는데, 이는 해당 메서드가 호출되는 객체 자신을 나타냅니다. 이를 통해 self를 사용하여 객체의 속성을 설정하거나 호출할 수 있습니다.

예를 들어, 다음과 같이 __init__ 메서드를 사용하여 클래스의 초기 상태를 설정할 수 있습니다

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Person 클래스의 객체 생성
person1 = Person("철수", 30)
person2 = Person("영희", 25)

print(person1.name, person1.age)  # 출력: 철수 30
print(person2.name, person2.age)  # 출력: 영희 25

위의 예시에서 Person 클래스의 __init__ 메서드는 이름(name)과 나이(age)라는 인자를 받아서 객체의 속성으로 설정하고 있습니다. 객체를 생성할 때 Person("철수", 30)와 같이 인자를 전달하여 초기 상태를 설정할 수 있습니다.

__init__ 메서드를 사용하면 클래스의 객체를 생성하고 초기화하는 작업을 간편하게 처리할 수 있으며, 클래스의 속성을 쉽게 설정할 수 있습니다.

 

3. __str__ 메서드 와 __repr__ 메서드

파이썬에서 __str__ 메서드는 사용자에게 유용한 정보를 주기 위해 사용합니다.

반면에 __repr__ 메서드는 개발자가 디버깅과 개발을 하는데 주로 사용합니다.

 

따라서 표시되는 내용을 이에 맞게 구현합니다.

 

둘 중 하나의 메서드가 있을 때 print 를 사용하면 자동으로 __str__메서드 또는 __repr__ 메서드의 내용을 출력합니다. 만약에 두개의 메서드가 모두 있다면 __str__ 메서드를 우선합니다.

두개의 메서드가 모두 없다면 객체의 래핑된 값을 출력합니다.

 

예제1) 클래스에 메서드가 있을 떄

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name}는 {self.age}살이다."

    def __repr__(self):
        return f"Person(name: {self.name}, age: {self.age})"

p = Person("mike",30)

print(p.__str__()) #출력:mike는 30살이다.
print(p.__repr__()) #출력:Person(name: mike, age: 30)

예제2) 클래스에 메서드가 없을 때

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("mike",30)

print(p.__str__()) #출력:<__main__.Person object at 0x000001A8F1BAAFD0>
print(p.__repr__()) #출력:<__main__.Person object at 0x000001A8F1BAAFD0>

4. __dict__ 메서드

__dict__ 메서드는 객체의 내용을 key와 value로 보기 위해 사용합니다.

 

클래스에 메서드를 구현해 놓지 않아도 바로 사용 가능합니다.

 

예제)

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("mike",30)

print(p.__dict__) # 출력: {'name': 'mike', 'age': 30}

5. 연산 메서드

class Fruit:

    def __init__(self,name, price):
        self._name = name
        self._price = price

    def __str__(self):
        return f"과일 이름은 {self._name}, 과일 가격은 {self._price}입니다."

    def __add__(self, other): # 더하는 메서드
        print("__add__ 메서드 호출")
        return self._price + other._price

    def __sub__(self, other): # 빼는 메서드
        print("__sub__ 메서드 호출")
        return self._price - other._price

    def __le__(self, other): # 대소비교 메서드 '='을 포함해야 한다.
        print("__le__ 메서드 호출")
        if self._price <= other._price:
            return True
        else:
            return False

    def __ge__(self, other): # 대소비교 메서드 '='을 포함해야 한다.
        print("__ge__ 메서드 호출")
        if self._price >= other._price:
            return True
        else:
            return False

f1 = Fruit('apple',8000)
f2 = Fruit('orange',5000)

print(f1) #출력: 과일 이름은 apple, 과일 가격은 8000입니다.
print(f2) #출력: 과일 이름은 orange, 과일 가격은 5000입니다.

print(f1+f2)
# 출력:
# __add__ 메서드 호출
# 13000

print(f1 - f2)
#출력:
# __sub__ 메서드 호출
# 3000

print(f1>=f2)
# 출력:
# __ge__ 메서드 호출
# True

print(f1<=f2)
#출력:
# __le__ 메서드 호출
# False

6. 좌표 연산 메서드

class Vector:

    def __init__(self,*args):
        '''
        create vector, example : v = Vector(5,10)
        '''
        if len(args) ==0:
            self._x, self._y = 0,0
        else:
            self._x,self._y = args

    def __repr__(self):
        '''
        :return vector information
        '''
        return 'Vector(%r,%r)' % (self._x,self._y)

    def __add__(self, other):

        return Vector(self._x+other._x, self._y+other._y)

    def __mul__(self, other):
        return Vector(self._x * other, self._y*other)

    def __bool__(self):
        '''

        if 0,0 return false else return true
        '''
        return bool(max(self._x,self._y))



v1 = Vector(5,7)
v2 = Vector(25,30)
v3 = Vector()

# 매직메서드 출력

print(Vector.__init__.__doc__) #출력:  create vector, example : v = Vector(5,10)
print(Vector.__repr__.__doc__) #출력:  :return vector information

print(Vector.__bool__.__doc__) #출력: if 0,0 return false else return true

print()
print(v1,v2,v3) #출력: Vector(5,7) Vector(25,30) Vector(0,0)
print(v1+v2) #출력:Vector(30,37)

print(v1*3) # 출력: Vector(15,21)
print(v2*10) #출력: Vector(250,300)
print(bool(v1),bool(v2),bool(v3)) #출력: True True False

'PYTHON Programming > Python' 카테고리의 다른 글

[python] 상속  (0) 2024.05.20
[python] 메서드  (0) 2024.05.20
[python] 클래스  (0) 2024.05.11
[python] 입출력  (0) 2024.04.23
[python] 함수  (0) 2024.04.23