본문 바로가기

카테고리 없음

[Python] 매직 메서드 (Magic Methods)

파이썬에서 매직 메서드는 더 특별한 동작을 정의하기 위해서 사용되는 특별한 이름을 가진 메서드다. 

얘들은 두 개의 밑줄로 시작하여 두 개의 밑줄로 끝난다.

 

이들이 클래스안에 여러 동작들을 처리하도록 도와준다. 

GPT한테 매서드 뭐있냐고 물어봤다. 

 

이렇게나 친절하고 똑똑하다....

 

그럼 매직메서드 예시코드로 가보자.

 

- 매직매서드 예시코드

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return f"Product: {self.name}, Price: {self.price}"

product = Product("Dolce Latte", 5100)
print(product)  
# 실행하면 Product: Dolce Latte, Price: 5100

__str__이라는 매직매서드 덕분에 print(객체) 실행시 str함수 안에 있는 정보가 값으로 나온다.

__str__ 매직 메서드가 없었다면, 객체를 print 했을 때, 이러한 메모리 정보가 나온다.

이 공간 안에 객체가 저장되어 있다고 함.

__str__이 이러한 마법을 부려주는 것이다. 

 

 

 

 

- Class로 비교 연산하기

어떤 물건을 갖다가 값으로 비교하는 일이 많아서 클래스로다가 비교하고 싶을 때가 있을 수 있다. 

 

헬스장에 사람이 너무 많아, 3대무게를 모두 합한 값을 2명이서 비교하여 무게를 덜 치는 사람을 내보내기로 했다고 가정하자. 

 

class HealthClub:
    def __init__(self, squat, deadlift, benchpress):
        self.squat = squat
        self.deadlift = deadlift
        self.benchpress = benchpress

    def __lt__(self, other):
        return self.squat + self.deadlift + self.benchpress < other.squat + other.deadlift + other.benchpress

person1 = HealthClub(100, 100, 145)
person2 = HealthClub(200, 250, 180)
print(person1 < person2)  # True

이렇게 비교하면 print결과가 True가 나와서 역도선수였던 person2가 헬스클럽에 남고,

person1은 집으로 돌아가야한다.

 

 

 

 

 

 

- Class 안의 객체를 이용해서 인덱싱, 반복 구현할 수 있음.

 

어느 헬스클럽에 사람이 너무 많아졌다. 그래서 3대 무게가 400이하인 사람들은 모두 회원 자격을 박탈하고, 회원권을 모두 환불해주기로 했다. 그래서 data를 조회하여 3개무게가 400이하라면 앞으로 헬스장을 올 수 없게 한다고 가정하자. 

 

class Above_400:
    def __init__(self, files):
        self.files = files

    def __getitem__(self, index):
        return self.files[index]

    def __len__(self):
        return len(self.files)

above_400 = Above_400([350, 410, 500, 550, 600, 300, 340, 370])
print(above_400[0])  # 350이 나옴
print(len(above_400))  # 8

첫 번째 회원의 data를 조회하니, 350이 나와서 이 회원은 앞으로 헬스장에 나올 수 없다. 

저 새로만든 above_400이라는 인스턴스에 리스트처럼 조회할 수 있도록 한 것은 __getitem__(): 덕분이다. 

이 친구를 통해 '[ ]'를 이용해서 객체의 요소를 가져올 수 있게 되는 것이다.

클래스의 객체 안에 있는 정보를 인덱싱할 때 굉장히 편리하다. 

 

__len__(): 매서드를 통해서는 인스턴스 안에 몇 개의 요소가 있는가 확인해볼 수 있었다.

지금 회원수가 8명인데, 4명은 앞으로 헬스장에 나올 수 없을것이다 ㅠ..