본문 바로가기
Python

파이썬 특수한 이름의 메서드

by 승환파크 2023. 5. 10.

__이름__() 형태의 메서드들은 특수한 상황에 자동으로 호출되도록 만들어졌다.

파이썬이 클래스를 사용할 때 제공해주는 보조 기능이다.

 

1. __str__

str() 함수의 매개변수로 객체를 넣으면 호출되는 메서드이다. 주로 객체를 문자열로 변환할 때 사용한다.

class Student:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        
    def get_sum(self):
        return self.korean + self.math + self.english + self.science
    
    def get_average(self):
        return self.get_sum() / 4
    
    def __str__(self):
        return f"{self.name}\t{self.get_sum()}\t{self.get_average()}"

students = [Student("윤인성", 87, 98, 88, 95),
            Student("연하진", 95, 98, 96, 98),
            Student("구지연", 76, 96, 94, 90)]

print("이름", "총점", "평균", sep = "\t")
for student in students:
    print(str(student))

# 결과값
# 이름	총점	평균
# 윤인성	368	92.0
# 연하진	387	96.75
# 구지연	356	89.0

 

 

2. 크기 비교 메서드

이름 영어 설명
eq equal 같다
ne not equal 다르다
gt greater than 크다
ge greater than or equal 크거나 같다
lt less then 작다
le less then or equal 작거나 같다
class Student:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        
    def get_sum(self):
        return self.korean + self.math + self.english + self.science
    
    def get_average(self):
        return self.get_sum() / 4
    
    def __str__(self):
        return f"{self.name}\t{self.get_sum()}\t{self.get_average()}"
    
    def __eq__(self, value):
        return self.get_sum() == value.get_sum()
    
    def __ne__(self, value):
        return self.get_sum() != value.get_sum()
    
    def __gt__(self, value):
        return self.get_sum() > value.get_sum()
    
    def __ge__(self, value):
        return self.get_sum() >= value.get_sum()
    
    def __lt__(self, value):
        return self.get_sum() < value.get_sum()
    
    def __le__(self, value):
        return self.get_sum() <= value.get_sum()

# 비교할 학생 선언
student_a = Student("나선주", 98, 92, 96, 92)
student_b = Student("윤아린", 95, 98, 98, 98)

student_a == student_b
# False

student_a != student_b
# True

student_a > student_b
# False

student_a < student_b
# True

크기 비교 연산자를 사용할 수 있는 이유는 클래스에 메서드를 작성했기 때문에 사용이 가능하다.

하지만 위에서 __str__ 메서드만 작성한 Student 클래스에서 실행하면 오류가 발생하게 된다.

 

만약 크기 비교 연산자를 사용하여 비교할 때 자료형을 한정하고 싶다면 예외 발생을 활용할 수 있다.

 

아까 코드와 같은 코드지만 eq 쪽만 수정하기

class Student:
    def __init__(self, name, korean, math, english, science):
        self.name = name
        self.korean = korean
        self.math = math
        self.english = english
        self.science = science
        
    def get_sum(self):
        return self.korean + self.math + self.english + self.science
    
    def get_average(self):
        return self.get_sum() / 4
    
    def __str__(self):
        return f"{self.name}\t{self.get_sum()}\t{self.get_average()}"
    
    def __eq__(self, value):
        if not isinstance(value, Student):
            raise TypeError("Student 클래스의 인스턴스만 비교할 수 있습니다.")
        return self.get_sum() == value.get_sum()
    
    def __ne__(self, value):
        return self.get_sum() != value.get_sum()
    
    def __gt__(self, value):
        return self.get_sum() > value.get_sum()
    
    def __ge__(self, value):
        return self.get_sum() >= value.get_sum()
    
    def __lt__(self, value):
        return self.get_sum() < value.get_sum()
    
    def __le__(self, value):
        return self.get_sum() <= value.get_sum()

student_a = Student("나선주", 98, 92, 96, 92)
student_a == 10
# 결과값
# TypeError: Student 클래스의 인스턴스만 비교할 수 있습니다.

'Python' 카테고리의 다른 글

파이썬 가비지 컬렉터  (1) 2023.05.10
파이썬 클래스 변수와 클래스 메서드  (0) 2023.05.10
파이썬 isinstance 함수  (0) 2023.05.09
파이썬 소멸자  (0) 2023.05.09
파이썬 모듈 생성  (0) 2023.05.09